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:")
4669be61bbbSBram Moolenaar  call CheckDefFailure(['let &option'], 'E1052:')
4679be61bbbSBram Moolenaar  call CheckDefFailure(['&g:option = 5'], 'E113:')
4689be61bbbSBram Moolenaar
469e55b1c09SBram Moolenaar  call CheckDefFailure(['let $VAR = 5'], 'E1016: Cannot declare an environment variable:')
4709be61bbbSBram Moolenaar
4719be61bbbSBram Moolenaar  call CheckDefFailure(['let @~ = 5'], 'E354:')
4729be61bbbSBram Moolenaar  call CheckDefFailure(['let @a = 5'], 'E1066:')
4739be61bbbSBram Moolenaar
474e55b1c09SBram Moolenaar  call CheckDefFailure(['let g:var = 5'], 'E1016: Cannot declare a global variable:')
475e55b1c09SBram Moolenaar  call CheckDefFailure(['let w:var = 5'], 'E1016: Cannot declare a window variable:')
476e55b1c09SBram Moolenaar  call CheckDefFailure(['let b:var = 5'], 'E1016: Cannot declare a buffer variable:')
477e55b1c09SBram Moolenaar  call CheckDefFailure(['let t:var = 5'], 'E1016: Cannot declare a tab variable:')
4789be61bbbSBram Moolenaar
4799be61bbbSBram Moolenaar  call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
4809be61bbbSBram Moolenaar  call CheckDefFailure(['let xnr += 4'], 'E1020:')
4819be61bbbSBram Moolenaar
482822ba247SBram Moolenaar  call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef', 'defcompile'], 'E1050:')
48333fa29cfSBram Moolenaar
4848a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
4858a7d6542SBram Moolenaar  call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
4868a7d6542SBram Moolenaar
4878a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
4888a7d6542SBram Moolenaar  call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
4898a7d6542SBram Moolenaar
4908a7d6542SBram Moolenaar  call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
4918a7d6542SBram Moolenaar  call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
49242a480bfSBram Moolenaar
493d77a8525SBram Moolenaar  call CheckDefFailure(['let var: dict <number>'], 'E1068:')
49442a480bfSBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
495cab27678SBram Moolenaar
496cab27678SBram Moolenaar  call assert_fails('s/^/\=Mess()/n', 'E794:')
497cab27678SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
49843e969d3SBram Moolenaar
49943e969d3SBram Moolenaar  call CheckDefFailure(['w:foo: number = 10'],
50043e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 1')
50143e969d3SBram Moolenaar  call CheckDefFailure(['t:foo: bool = true'],
50243e969d3SBram Moolenaar                       'E488: Trailing characters: : bool = true')
50343e969d3SBram Moolenaar  call CheckDefFailure(['b:foo: string = "x"'],
50443e969d3SBram Moolenaar                       'E488: Trailing characters: : string = "x"')
50543e969d3SBram Moolenaar  call CheckDefFailure(['g:foo: number = 123'],
50643e969d3SBram Moolenaar                       'E488: Trailing characters: : number = 123')
507d72c1bf0SBram Moolenaarenddef
508d72c1bf0SBram Moolenaar
509d72c1bf0SBram Moolenaardef Test_unlet()
510d72c1bf0SBram Moolenaar  g:somevar = 'yes'
511d72c1bf0SBram Moolenaar  assert_true(exists('g:somevar'))
512d72c1bf0SBram Moolenaar  unlet g:somevar
513d72c1bf0SBram Moolenaar  assert_false(exists('g:somevar'))
514d72c1bf0SBram Moolenaar  unlet! g:somevar
515d72c1bf0SBram Moolenaar
516d72c1bf0SBram Moolenaar  call CheckScriptFailure([
517d72c1bf0SBram Moolenaar        'vim9script',
518d72c1bf0SBram Moolenaar        'let svar = 123',
519d72c1bf0SBram Moolenaar        'unlet svar',
520d72c1bf0SBram Moolenaar        ], 'E1081:')
521d72c1bf0SBram Moolenaar  call CheckScriptFailure([
522d72c1bf0SBram Moolenaar        'vim9script',
523d72c1bf0SBram Moolenaar        'let svar = 123',
524d72c1bf0SBram Moolenaar        'unlet s:svar',
525d72c1bf0SBram Moolenaar        ], 'E1081:')
526d72c1bf0SBram Moolenaar  call CheckScriptFailure([
527d72c1bf0SBram Moolenaar        'vim9script',
528d72c1bf0SBram Moolenaar        'let svar = 123',
529d72c1bf0SBram Moolenaar        'def Func()',
530d72c1bf0SBram Moolenaar        '  unlet svar',
531d72c1bf0SBram Moolenaar        'enddef',
532822ba247SBram Moolenaar        'defcompile',
533d72c1bf0SBram Moolenaar        ], 'E1081:')
534d72c1bf0SBram Moolenaar  call CheckScriptFailure([
535d72c1bf0SBram Moolenaar        'vim9script',
536d72c1bf0SBram Moolenaar        'let svar = 123',
537d72c1bf0SBram Moolenaar        'def Func()',
538d72c1bf0SBram Moolenaar        '  unlet s:svar',
539d72c1bf0SBram Moolenaar        'enddef',
540822ba247SBram Moolenaar        'defcompile',
541d72c1bf0SBram Moolenaar        ], 'E1081:')
5427bdaea6eSBram Moolenaar
5437bdaea6eSBram Moolenaar  $ENVVAR = 'foobar'
5447bdaea6eSBram Moolenaar  assert_equal('foobar', $ENVVAR)
5457bdaea6eSBram Moolenaar  unlet $ENVVAR
5467bdaea6eSBram Moolenaar  assert_equal('', $ENVVAR)
547d72c1bf0SBram Moolenaarenddef
548599c89c8SBram Moolenaar
5494c17ad94SBram Moolenaardef Test_delfunction()
550f5be8cdbSBram Moolenaar  # Check function is defined in script namespace
5514c17ad94SBram Moolenaar  CheckScriptSuccess([
5524c17ad94SBram Moolenaar      'vim9script',
5534c17ad94SBram Moolenaar      'func CheckMe()',
5544c17ad94SBram Moolenaar      '  return 123',
5554c17ad94SBram Moolenaar      'endfunc',
5564c17ad94SBram Moolenaar      'assert_equal(123, s:CheckMe())',
5574c17ad94SBram Moolenaar      ])
5584c17ad94SBram Moolenaar
559f5be8cdbSBram Moolenaar  # Check function in script namespace cannot be deleted
5604c17ad94SBram Moolenaar  CheckScriptFailure([
5614c17ad94SBram Moolenaar      'vim9script',
5624c17ad94SBram Moolenaar      'func DeleteMe1()',
5634c17ad94SBram Moolenaar      'endfunc',
5644c17ad94SBram Moolenaar      'delfunction DeleteMe1',
5654c17ad94SBram Moolenaar      ], 'E1084:')
5664c17ad94SBram Moolenaar  CheckScriptFailure([
5674c17ad94SBram Moolenaar      'vim9script',
5684c17ad94SBram Moolenaar      'func DeleteMe2()',
5694c17ad94SBram Moolenaar      'endfunc',
5704c17ad94SBram Moolenaar      'def DoThat()',
5714c17ad94SBram Moolenaar      '  delfunction DeleteMe2',
5724c17ad94SBram Moolenaar      'enddef',
5734c17ad94SBram Moolenaar      'DoThat()',
5744c17ad94SBram Moolenaar      ], 'E1084:')
5754c17ad94SBram Moolenaar  CheckScriptFailure([
5764c17ad94SBram Moolenaar      'vim9script',
5774c17ad94SBram Moolenaar      'def DeleteMe3()',
5784c17ad94SBram Moolenaar      'enddef',
5794c17ad94SBram Moolenaar      'delfunction DeleteMe3',
5804c17ad94SBram Moolenaar      ], 'E1084:')
5814c17ad94SBram Moolenaar  CheckScriptFailure([
5824c17ad94SBram Moolenaar      'vim9script',
5834c17ad94SBram Moolenaar      'def DeleteMe4()',
5844c17ad94SBram Moolenaar      'enddef',
5854c17ad94SBram Moolenaar      'def DoThat()',
5864c17ad94SBram Moolenaar      '  delfunction DeleteMe4',
5874c17ad94SBram Moolenaar      'enddef',
5884c17ad94SBram Moolenaar      'DoThat()',
5894c17ad94SBram Moolenaar      ], 'E1084:')
590925e9fd6SBram Moolenaar
591925e9fd6SBram Moolenaar  # Check that global :def function can be replaced and deleted
592925e9fd6SBram Moolenaar  let lines =<< trim END
593925e9fd6SBram Moolenaar      vim9script
594925e9fd6SBram Moolenaar      def g:Global(): string
595925e9fd6SBram Moolenaar        return "yes"
596925e9fd6SBram Moolenaar      enddef
597925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
598925e9fd6SBram Moolenaar      def! g:Global(): string
599925e9fd6SBram Moolenaar        return "no"
600925e9fd6SBram Moolenaar      enddef
601925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
602925e9fd6SBram Moolenaar      delfunc g:Global
603925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
604925e9fd6SBram Moolenaar  END
605925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
606925e9fd6SBram Moolenaar
607925e9fd6SBram Moolenaar  # Check that global function can be replaced by a :def function and deleted
608925e9fd6SBram Moolenaar  lines =<< trim END
609925e9fd6SBram Moolenaar      vim9script
610925e9fd6SBram Moolenaar      func g:Global()
611925e9fd6SBram Moolenaar        return "yes"
612925e9fd6SBram Moolenaar      endfunc
613925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
614925e9fd6SBram Moolenaar      def! g:Global(): string
615925e9fd6SBram Moolenaar        return "no"
616925e9fd6SBram Moolenaar      enddef
617925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
618925e9fd6SBram Moolenaar      delfunc g:Global
619925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
620925e9fd6SBram Moolenaar  END
621925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
622925e9fd6SBram Moolenaar
623925e9fd6SBram Moolenaar  # Check that global :def function can be replaced by a function and deleted
624925e9fd6SBram Moolenaar  lines =<< trim END
625925e9fd6SBram Moolenaar      vim9script
626925e9fd6SBram Moolenaar      def g:Global(): string
627925e9fd6SBram Moolenaar        return "yes"
628925e9fd6SBram Moolenaar      enddef
629925e9fd6SBram Moolenaar      assert_equal("yes", g:Global())
630925e9fd6SBram Moolenaar      func! g:Global()
631925e9fd6SBram Moolenaar        return "no"
632925e9fd6SBram Moolenaar      endfunc
633925e9fd6SBram Moolenaar      assert_equal("no", g:Global())
634925e9fd6SBram Moolenaar      delfunc g:Global
635925e9fd6SBram Moolenaar      assert_false(exists('*g:Global'))
636925e9fd6SBram Moolenaar  END
637925e9fd6SBram Moolenaar  CheckScriptSuccess(lines)
6384c17ad94SBram Moolenaarenddef
6394c17ad94SBram Moolenaar
640599c89c8SBram Moolenaarfunc Test_wrong_type()
641599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<nothing>'], 'E1010:')
642599c89c8SBram Moolenaar  call CheckDefFailure(['let var: list<list<nothing>>'], 'E1010:')
643599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<nothing>'], 'E1010:')
644599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<dict<nothing>>'], 'E1010:')
645599c89c8SBram Moolenaar
646599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<number'], 'E1009:')
647599c89c8SBram Moolenaar  call CheckDefFailure(['let var: dict<list<number>'], 'E1009:')
64842a480bfSBram Moolenaar
64942a480bfSBram Moolenaar  call CheckDefFailure(['let var: ally'], 'E1010:')
65042a480bfSBram Moolenaar  call CheckDefFailure(['let var: bram'], 'E1010:')
65142a480bfSBram Moolenaar  call CheckDefFailure(['let var: cathy'], 'E1010:')
65242a480bfSBram Moolenaar  call CheckDefFailure(['let var: dom'], 'E1010:')
65342a480bfSBram Moolenaar  call CheckDefFailure(['let var: freddy'], 'E1010:')
65442a480bfSBram Moolenaar  call CheckDefFailure(['let var: john'], 'E1010:')
65542a480bfSBram Moolenaar  call CheckDefFailure(['let var: larry'], 'E1010:')
65642a480bfSBram Moolenaar  call CheckDefFailure(['let var: ned'], 'E1010:')
65742a480bfSBram Moolenaar  call CheckDefFailure(['let var: pam'], 'E1010:')
65842a480bfSBram Moolenaar  call CheckDefFailure(['let var: sam'], 'E1010:')
65942a480bfSBram Moolenaar  call CheckDefFailure(['let var: vim'], 'E1010:')
660a0a9f43aSBram Moolenaar
661a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: number', 'Ref()'], 'E1085:')
662a0a9f43aSBram Moolenaar  call CheckDefFailure(['let Ref: string', 'let res = Ref()'], 'E1085:')
6638a7d6542SBram Moolenaarendfunc
6648a7d6542SBram Moolenaar
6658a7d6542SBram Moolenaarfunc Test_const()
6668a7d6542SBram Moolenaar  call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
6678a7d6542SBram Moolenaar  call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
6688a7d6542SBram Moolenaar  call CheckDefFailure(['const two'], 'E1021:')
6699be61bbbSBram Moolenaar  call CheckDefFailure(['const &option'], 'E996:')
6708a7d6542SBram Moolenaarendfunc
6718a7d6542SBram Moolenaar
672df069eecSBram Moolenaardef Test_range_no_colon()
673df069eecSBram Moolenaar  call CheckDefFailure(['%s/a/b/'], 'E1050:')
674df069eecSBram Moolenaar  call CheckDefFailure(['+ s/a/b/'], 'E1050:')
675df069eecSBram Moolenaar  call CheckDefFailure(['- s/a/b/'], 'E1050:')
676df069eecSBram Moolenaar  call CheckDefFailure(['. s/a/b/'], 'E1050:')
677df069eecSBram Moolenaarenddef
678df069eecSBram Moolenaar
679df069eecSBram Moolenaar
6808a7d6542SBram Moolenaardef Test_block()
6818a7d6542SBram Moolenaar  let outer = 1
6828a7d6542SBram Moolenaar  {
6838a7d6542SBram Moolenaar    let inner = 2
6848a7d6542SBram Moolenaar    assert_equal(1, outer)
6858a7d6542SBram Moolenaar    assert_equal(2, inner)
6868a7d6542SBram Moolenaar  }
6878a7d6542SBram Moolenaar  assert_equal(1, outer)
6888a7d6542SBram Moolenaarenddef
6898a7d6542SBram Moolenaar
6908a7d6542SBram Moolenaarfunc Test_block_failure()
6918a7d6542SBram Moolenaar  call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
692585fea7bSBram Moolenaar  call CheckDefFailure(['}'], 'E1025:')
693585fea7bSBram Moolenaar  call CheckDefFailure(['{', 'echo 1'], 'E1026:')
6948a7d6542SBram Moolenaarendfunc
6958a7d6542SBram Moolenaar
696585fea7bSBram Moolenaardef Test_cmd_modifier()
697585fea7bSBram Moolenaar  tab echo '0'
698585fea7bSBram Moolenaar  call CheckDefFailure(['5tab echo 3'], 'E16:')
699585fea7bSBram Moolenaarenddef
700585fea7bSBram Moolenaar
701d032f34aSBram Moolenaarfunc g:NoSuchFunc()
702d032f34aSBram Moolenaar  echo 'none'
703d032f34aSBram Moolenaarendfunc
704d032f34aSBram Moolenaar
7058a7d6542SBram Moolenaardef Test_try_catch()
7068a7d6542SBram Moolenaar  let l = []
7077a092245SBram Moolenaar  try # comment
7088a7d6542SBram Moolenaar    add(l, '1')
7098a7d6542SBram Moolenaar    throw 'wrong'
7108a7d6542SBram Moolenaar    add(l, '2')
7117a092245SBram Moolenaar  catch # comment
7128a7d6542SBram Moolenaar    add(l, v:exception)
7137a092245SBram Moolenaar  finally # comment
7148a7d6542SBram Moolenaar    add(l, '3')
7157a092245SBram Moolenaar  endtry # comment
7168a7d6542SBram Moolenaar  assert_equal(['1', 'wrong', '3'], l)
71768d130c6SBram Moolenaar
718e859312eSBram Moolenaar  l = []
719e859312eSBram Moolenaar  try
720e859312eSBram Moolenaar    try
721e859312eSBram Moolenaar      add(l, '1')
722e859312eSBram Moolenaar      throw 'wrong'
723e859312eSBram Moolenaar      add(l, '2')
724e859312eSBram Moolenaar    catch /right/
725e859312eSBram Moolenaar      add(l, v:exception)
726e859312eSBram Moolenaar    endtry
727e859312eSBram Moolenaar  catch /wrong/
728e859312eSBram Moolenaar    add(l, 'caught')
729e859312eSBram Moolenaar  finally
730e859312eSBram Moolenaar    add(l, 'finally')
731e859312eSBram Moolenaar  endtry
732e859312eSBram Moolenaar  assert_equal(['1', 'caught', 'finally'], l)
733e859312eSBram Moolenaar
73468d130c6SBram Moolenaar  let n: number
73568d130c6SBram Moolenaar  try
73668d130c6SBram Moolenaar    n = l[3]
73768d130c6SBram Moolenaar  catch /E684:/
73868d130c6SBram Moolenaar    n = 99
73968d130c6SBram Moolenaar  endtry
74068d130c6SBram Moolenaar  assert_equal(99, n)
74168d130c6SBram Moolenaar
74268d130c6SBram Moolenaar  try
74368d130c6SBram Moolenaar    n = g:astring[3]
74468d130c6SBram Moolenaar  catch /E714:/
74568d130c6SBram Moolenaar    n = 77
74668d130c6SBram Moolenaar  endtry
74768d130c6SBram Moolenaar  assert_equal(77, n)
74868d130c6SBram Moolenaar
74968d130c6SBram Moolenaar  try
75068d130c6SBram Moolenaar    n = l[g:astring]
75168d130c6SBram Moolenaar  catch /E39:/
75268d130c6SBram Moolenaar    n = 77
75368d130c6SBram Moolenaar  endtry
75468d130c6SBram Moolenaar  assert_equal(77, n)
75568d130c6SBram Moolenaar
75668d130c6SBram Moolenaar  try
75768d130c6SBram Moolenaar    n = s:does_not_exist
75868d130c6SBram Moolenaar  catch /E121:/
759f0b9f43cSBram Moolenaar    n = 111
760f0b9f43cSBram Moolenaar  endtry
761f0b9f43cSBram Moolenaar  assert_equal(111, n)
762f0b9f43cSBram Moolenaar
763f0b9f43cSBram Moolenaar  try
764f0b9f43cSBram Moolenaar    n = g:does_not_exist
765f0b9f43cSBram Moolenaar  catch /E121:/
76668d130c6SBram Moolenaar    n = 121
76768d130c6SBram Moolenaar  endtry
76868d130c6SBram Moolenaar  assert_equal(121, n)
76968d130c6SBram Moolenaar
77068d130c6SBram Moolenaar  let d = #{one: 1}
77168d130c6SBram Moolenaar  try
77268d130c6SBram Moolenaar    n = d[g:astring]
77368d130c6SBram Moolenaar  catch /E716:/
77468d130c6SBram Moolenaar    n = 222
77568d130c6SBram Moolenaar  endtry
77668d130c6SBram Moolenaar  assert_equal(222, n)
777f0b9f43cSBram Moolenaar
778f0b9f43cSBram Moolenaar  try
779f0b9f43cSBram Moolenaar    n = -g:astring
780f0b9f43cSBram Moolenaar  catch /E39:/
781f0b9f43cSBram Moolenaar    n = 233
782f0b9f43cSBram Moolenaar  endtry
783f0b9f43cSBram Moolenaar  assert_equal(233, n)
784f0b9f43cSBram Moolenaar
785f0b9f43cSBram Moolenaar  try
786f0b9f43cSBram Moolenaar    n = +g:astring
787f0b9f43cSBram Moolenaar  catch /E1030:/
788f0b9f43cSBram Moolenaar    n = 244
789f0b9f43cSBram Moolenaar  endtry
790f0b9f43cSBram Moolenaar  assert_equal(244, n)
791f0b9f43cSBram Moolenaar
792f0b9f43cSBram Moolenaar  try
793f0b9f43cSBram Moolenaar    n = +g:alist
794f0b9f43cSBram Moolenaar  catch /E745:/
795f0b9f43cSBram Moolenaar    n = 255
796f0b9f43cSBram Moolenaar  endtry
797f0b9f43cSBram Moolenaar  assert_equal(255, n)
798f0b9f43cSBram Moolenaar
799f0b9f43cSBram Moolenaar  let nd: dict<any>
800f0b9f43cSBram Moolenaar  try
801f0b9f43cSBram Moolenaar    nd = {g:anumber: 1}
802f0b9f43cSBram Moolenaar  catch /E1029:/
803f0b9f43cSBram Moolenaar    n = 266
804f0b9f43cSBram Moolenaar  endtry
805f0b9f43cSBram Moolenaar  assert_equal(266, n)
806f0b9f43cSBram Moolenaar
807f0b9f43cSBram Moolenaar  try
808f0b9f43cSBram Moolenaar    [n] = [1, 2, 3]
809f0b9f43cSBram Moolenaar  catch /E1093:/
810f0b9f43cSBram Moolenaar    n = 277
811f0b9f43cSBram Moolenaar  endtry
812f0b9f43cSBram Moolenaar  assert_equal(277, n)
813f0b9f43cSBram Moolenaar
814e859312eSBram Moolenaar  try
815e859312eSBram Moolenaar    &ts = g:astring
816e859312eSBram Moolenaar  catch /E1029:/
817e859312eSBram Moolenaar    n = 288
818e859312eSBram Moolenaar  endtry
819e859312eSBram Moolenaar  assert_equal(288, n)
820e859312eSBram Moolenaar
821e859312eSBram Moolenaar  try
822e859312eSBram Moolenaar    &backspace = 'asdf'
823e859312eSBram Moolenaar  catch /E474:/
824e859312eSBram Moolenaar    n = 299
825e859312eSBram Moolenaar  endtry
826e859312eSBram Moolenaar  assert_equal(299, n)
827e859312eSBram Moolenaar
828e859312eSBram Moolenaar  l = [1]
829e859312eSBram Moolenaar  try
830e859312eSBram Moolenaar    l[3] = 3
831e859312eSBram Moolenaar  catch /E684:/
832e859312eSBram Moolenaar    n = 300
833e859312eSBram Moolenaar  endtry
834e859312eSBram Moolenaar  assert_equal(300, n)
835e859312eSBram Moolenaar
836e859312eSBram Moolenaar  try
837e859312eSBram Moolenaar    unlet g:does_not_exist
838e859312eSBram Moolenaar  catch /E108:/
839e859312eSBram Moolenaar    n = 322
840e859312eSBram Moolenaar  endtry
841e859312eSBram Moolenaar  assert_equal(322, n)
842e859312eSBram Moolenaar
843e859312eSBram Moolenaar  try
844e859312eSBram Moolenaar    d = {'text': 1, g:astring: 2}
845e859312eSBram Moolenaar  catch /E721:/
846e859312eSBram Moolenaar    n = 333
847e859312eSBram Moolenaar  endtry
848e859312eSBram Moolenaar  assert_equal(333, n)
849e859312eSBram Moolenaar
850e859312eSBram Moolenaar  try
851e859312eSBram Moolenaar    l = DeletedFunc()
852e859312eSBram Moolenaar  catch /E933:/
853e859312eSBram Moolenaar    n = 344
854e859312eSBram Moolenaar  endtry
855e859312eSBram Moolenaar  assert_equal(344, n)
856d032f34aSBram Moolenaar
857d032f34aSBram Moolenaar  try
858d032f34aSBram Moolenaar    echo len(v:true)
859d032f34aSBram Moolenaar  catch /E701:/
860d032f34aSBram Moolenaar    n = 355
861d032f34aSBram Moolenaar  endtry
862d032f34aSBram Moolenaar  assert_equal(355, n)
863d032f34aSBram Moolenaar
864d032f34aSBram Moolenaar  let P = function('g:NoSuchFunc')
865d032f34aSBram Moolenaar  delfunc g:NoSuchFunc
866d032f34aSBram Moolenaar  try
867d032f34aSBram Moolenaar    echo P()
868d032f34aSBram Moolenaar  catch /E117:/
869d032f34aSBram Moolenaar    n = 366
870d032f34aSBram Moolenaar  endtry
871d032f34aSBram Moolenaar  assert_equal(366, n)
872d032f34aSBram Moolenaar
873d032f34aSBram Moolenaar  try
874d032f34aSBram Moolenaar    echo g:NoSuchFunc()
875d032f34aSBram Moolenaar  catch /E117:/
876d032f34aSBram Moolenaar    n = 377
877d032f34aSBram Moolenaar  endtry
878d032f34aSBram Moolenaar  assert_equal(377, n)
879d032f34aSBram Moolenaar
880d032f34aSBram Moolenaar  try
881d032f34aSBram Moolenaar    echo g:alist + 4
882d032f34aSBram Moolenaar  catch /E745:/
883d032f34aSBram Moolenaar    n = 388
884d032f34aSBram Moolenaar  endtry
885d032f34aSBram Moolenaar  assert_equal(388, n)
886d032f34aSBram Moolenaar
887d032f34aSBram Moolenaar  try
888d032f34aSBram Moolenaar    echo 4 + g:alist
889d032f34aSBram Moolenaar  catch /E745:/
890d032f34aSBram Moolenaar    n = 399
891d032f34aSBram Moolenaar  endtry
892d032f34aSBram Moolenaar  assert_equal(399, n)
893d032f34aSBram Moolenaar
894d032f34aSBram Moolenaar  try
895d032f34aSBram Moolenaar    echo g:alist.member
896d032f34aSBram Moolenaar  catch /E715:/
897d032f34aSBram Moolenaar    n = 400
898d032f34aSBram Moolenaar  endtry
899d032f34aSBram Moolenaar  assert_equal(400, n)
900d032f34aSBram Moolenaar
901d032f34aSBram Moolenaar  try
902d032f34aSBram Moolenaar    echo d.member
903d032f34aSBram Moolenaar  catch /E716:/
904d032f34aSBram Moolenaar    n = 411
905d032f34aSBram Moolenaar  endtry
906d032f34aSBram Moolenaar  assert_equal(411, n)
9078a7d6542SBram Moolenaarenddef
9088a7d6542SBram Moolenaar
909e859312eSBram Moolenaardef DeletedFunc(): list<any>
910e859312eSBram Moolenaar  return ['delete me']
911e859312eSBram Moolenaarenddef
912e859312eSBram Moolenaardefcompile
913e859312eSBram Moolenaardelfunc DeletedFunc
914e859312eSBram Moolenaar
915257cc5eeSBram Moolenaardef ThrowFromDef()
916a72cfb80SBram Moolenaar  throw "getout" # comment
917257cc5eeSBram Moolenaarenddef
918257cc5eeSBram Moolenaar
919257cc5eeSBram Moolenaarfunc CatchInFunc()
920257cc5eeSBram Moolenaar  try
921257cc5eeSBram Moolenaar    call ThrowFromDef()
922257cc5eeSBram Moolenaar  catch
923257cc5eeSBram Moolenaar    let g:thrown_func = v:exception
924257cc5eeSBram Moolenaar  endtry
925257cc5eeSBram Moolenaarendfunc
926257cc5eeSBram Moolenaar
927257cc5eeSBram Moolenaardef CatchInDef()
928257cc5eeSBram Moolenaar  try
929257cc5eeSBram Moolenaar    ThrowFromDef()
930257cc5eeSBram Moolenaar  catch
931257cc5eeSBram Moolenaar    g:thrown_def = v:exception
932257cc5eeSBram Moolenaar  endtry
933257cc5eeSBram Moolenaarenddef
934257cc5eeSBram Moolenaar
935f575adffSBram Moolenaardef ReturnFinally(): string
936f575adffSBram Moolenaar  try
937f575adffSBram Moolenaar    return 'intry'
938f575adffSBram Moolenaar  finally
939f575adffSBram Moolenaar    g:in_finally = 'finally'
940f575adffSBram Moolenaar  endtry
941f575adffSBram Moolenaar  return 'end'
942f575adffSBram Moolenaarenddef
943f575adffSBram Moolenaar
944257cc5eeSBram Moolenaardef Test_try_catch_nested()
945257cc5eeSBram Moolenaar  CatchInFunc()
946257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_func)
947257cc5eeSBram Moolenaar
948257cc5eeSBram Moolenaar  CatchInDef()
949257cc5eeSBram Moolenaar  assert_equal('getout', g:thrown_def)
950f575adffSBram Moolenaar
951f575adffSBram Moolenaar  assert_equal('intry', ReturnFinally())
952f575adffSBram Moolenaar  assert_equal('finally', g:in_finally)
953f575adffSBram Moolenaarenddef
954f575adffSBram Moolenaar
955f575adffSBram Moolenaardef Test_try_catch_match()
956f575adffSBram Moolenaar  let seq = 'a'
957f575adffSBram Moolenaar  try
958f575adffSBram Moolenaar    throw 'something'
959f575adffSBram Moolenaar  catch /nothing/
960f575adffSBram Moolenaar    seq ..= 'x'
961f575adffSBram Moolenaar  catch /some/
962f575adffSBram Moolenaar    seq ..= 'b'
963f575adffSBram Moolenaar  catch /asdf/
964f575adffSBram Moolenaar    seq ..= 'x'
965e8c4abbbSBram Moolenaar  catch ?a\?sdf?
966e8c4abbbSBram Moolenaar    seq ..= 'y'
967f575adffSBram Moolenaar  finally
968f575adffSBram Moolenaar    seq ..= 'c'
969f575adffSBram Moolenaar  endtry
970f575adffSBram Moolenaar  assert_equal('abc', seq)
971257cc5eeSBram Moolenaarenddef
972257cc5eeSBram Moolenaar
973e8c4abbbSBram Moolenaardef Test_try_catch_fails()
974e8c4abbbSBram Moolenaar  call CheckDefFailure(['catch'], 'E603:')
975e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:')
976e8c4abbbSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:')
977585fea7bSBram Moolenaar  call CheckDefFailure(['finally'], 'E606:')
978585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:')
979585fea7bSBram Moolenaar  call CheckDefFailure(['endtry'], 'E602:')
980585fea7bSBram Moolenaar  call CheckDefFailure(['while 1', 'endtry'], 'E170:')
981585fea7bSBram Moolenaar  call CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:')
982585fea7bSBram Moolenaar  call CheckDefFailure(['if 2', 'endtry'], 'E171:')
983585fea7bSBram Moolenaar  call CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:')
984585fea7bSBram Moolenaar
985a72cfb80SBram Moolenaar  call CheckDefFailure(['throw'], 'E1015:')
986585fea7bSBram Moolenaar  call CheckDefFailure(['throw xxx'], 'E1001:')
987e8c4abbbSBram Moolenaarenddef
988e8c4abbbSBram Moolenaar
989006ad48bSBram Moolenaardef Test_throw_vimscript()
990f5be8cdbSBram Moolenaar  # only checks line continuation
991006ad48bSBram Moolenaar  let lines =<< trim END
992006ad48bSBram Moolenaar      vim9script
993006ad48bSBram Moolenaar      try
994006ad48bSBram Moolenaar        throw 'one'
995006ad48bSBram Moolenaar              .. 'two'
996006ad48bSBram Moolenaar      catch
997006ad48bSBram Moolenaar        assert_equal('onetwo', v:exception)
998006ad48bSBram Moolenaar      endtry
999006ad48bSBram Moolenaar  END
1000006ad48bSBram Moolenaar  CheckScriptSuccess(lines)
1001006ad48bSBram Moolenaarenddef
1002006ad48bSBram Moolenaar
100337c83711SBram Moolenaardef Test_cexpr_vimscript()
1004f5be8cdbSBram Moolenaar  # only checks line continuation
100537c83711SBram Moolenaar  set errorformat=File\ %f\ line\ %l
100637c83711SBram Moolenaar  let lines =<< trim END
100737c83711SBram Moolenaar      vim9script
100837c83711SBram Moolenaar      cexpr 'File'
100937c83711SBram Moolenaar                .. ' someFile' ..
101037c83711SBram Moolenaar                   ' line 19'
101137c83711SBram Moolenaar      assert_equal(19, getqflist()[0].lnum)
101237c83711SBram Moolenaar  END
101337c83711SBram Moolenaar  CheckScriptSuccess(lines)
101437c83711SBram Moolenaar  set errorformat&
101537c83711SBram Moolenaarenddef
101637c83711SBram Moolenaar
1017b209750bSBram Moolenaardef Test_list_vimscript()
1018b209750bSBram Moolenaar  # checks line continuation and comments
1019b209750bSBram Moolenaar  let lines =<< trim END
1020b209750bSBram Moolenaar      vim9script
1021b209750bSBram Moolenaar      let mylist = [
1022b209750bSBram Moolenaar            'one',
1023b209750bSBram Moolenaar            # comment
1024b209750bSBram Moolenaar            'two', # empty line follows
1025b209750bSBram Moolenaar
1026b209750bSBram Moolenaar            'three',
1027b209750bSBram Moolenaar            ]
1028b209750bSBram Moolenaar      assert_equal(['one', 'two', 'three'], mylist)
1029b209750bSBram Moolenaar  END
1030b209750bSBram Moolenaar  CheckScriptSuccess(lines)
1031b209750bSBram Moolenaarenddef
1032b209750bSBram Moolenaar
10332a1381c3SBram Moolenaarif has('channel')
103440ee466cSBram Moolenaar  let someJob = test_null_job()
103540ee466cSBram Moolenaar
103640ee466cSBram Moolenaar  def FuncWithError()
103740ee466cSBram Moolenaar    echomsg g:someJob
103840ee466cSBram Moolenaar  enddef
103940ee466cSBram Moolenaar
104040ee466cSBram Moolenaar  func Test_convert_emsg_to_exception()
104140ee466cSBram Moolenaar    try
104240ee466cSBram Moolenaar      call FuncWithError()
104340ee466cSBram Moolenaar    catch
104440ee466cSBram Moolenaar      call assert_match('Vim:E908:', v:exception)
104540ee466cSBram Moolenaar    endtry
104640ee466cSBram Moolenaar  endfunc
10472a1381c3SBram Moolenaarendif
104840ee466cSBram Moolenaar
10498a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END
10508a7d6542SBram Moolenaar  vim9script
10518a7d6542SBram Moolenaar  let name: string = 'bob'
10528a7d6542SBram Moolenaar  def Concat(arg: string): string
10538a7d6542SBram Moolenaar    return name .. arg
10548a7d6542SBram Moolenaar  enddef
1055227a69deSBram Moolenaar  g:result = Concat('bie')
1056227a69deSBram Moolenaar  g:localname = name
10578a7d6542SBram Moolenaar
10588a7d6542SBram Moolenaar  export const CONST = 1234
10598a7d6542SBram Moolenaar  export let exported = 9876
10606e587dcbSBram Moolenaar  export let exp_name = 'John'
10618a7d6542SBram Moolenaar  export def Exported(): string
10628a7d6542SBram Moolenaar    return 'Exported'
10638a7d6542SBram Moolenaar  enddef
10648a7d6542SBram MoolenaarEND
10658a7d6542SBram Moolenaar
10665269bd2aSBram Moolenaardef Test_vim9_import_export()
10678a7d6542SBram Moolenaar  let import_script_lines =<< trim END
10688a7d6542SBram Moolenaar    vim9script
10698a7d6542SBram Moolenaar    import {exported, Exported} from './Xexport.vim'
10708a7d6542SBram Moolenaar    g:imported = exported
10716e587dcbSBram Moolenaar    exported += 3
10726e587dcbSBram Moolenaar    g:imported_added = exported
10738a7d6542SBram Moolenaar    g:imported_func = Exported()
10746e587dcbSBram Moolenaar
107540f4f7a4SBram Moolenaar    def GetExported(): string
107640f4f7a4SBram Moolenaar      let local_dict = #{ref: Exported}
107740f4f7a4SBram Moolenaar      return local_dict.ref()
107840f4f7a4SBram Moolenaar    enddef
107940f4f7a4SBram Moolenaar    g:funcref_result = GetExported()
108040f4f7a4SBram Moolenaar
10816e587dcbSBram Moolenaar    import {exp_name} from './Xexport.vim'
10826e587dcbSBram Moolenaar    g:imported_name = exp_name
10836e587dcbSBram Moolenaar    exp_name ..= ' Doe'
10846e587dcbSBram Moolenaar    g:imported_name_appended = exp_name
10855381c7a1SBram Moolenaar    g:imported_later = exported
10868a7d6542SBram Moolenaar  END
10878a7d6542SBram Moolenaar
10888a7d6542SBram Moolenaar  writefile(import_script_lines, 'Ximport.vim')
10898a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport.vim')
10908a7d6542SBram Moolenaar
10918a7d6542SBram Moolenaar  source Ximport.vim
10928a7d6542SBram Moolenaar
10938a7d6542SBram Moolenaar  assert_equal('bobbie', g:result)
10948a7d6542SBram Moolenaar  assert_equal('bob', g:localname)
10958a7d6542SBram Moolenaar  assert_equal(9876, g:imported)
10966e587dcbSBram Moolenaar  assert_equal(9879, g:imported_added)
10975381c7a1SBram Moolenaar  assert_equal(9879, g:imported_later)
10988a7d6542SBram Moolenaar  assert_equal('Exported', g:imported_func)
109940f4f7a4SBram Moolenaar  assert_equal('Exported', g:funcref_result)
11006e587dcbSBram Moolenaar  assert_equal('John', g:imported_name)
11016e587dcbSBram Moolenaar  assert_equal('John Doe', g:imported_name_appended)
11028a7d6542SBram Moolenaar  assert_false(exists('g:name'))
11038a7d6542SBram Moolenaar
11048a7d6542SBram Moolenaar  unlet g:result
11058a7d6542SBram Moolenaar  unlet g:localname
11068a7d6542SBram Moolenaar  unlet g:imported
11076e587dcbSBram Moolenaar  unlet g:imported_added
11085381c7a1SBram Moolenaar  unlet g:imported_later
11098a7d6542SBram Moolenaar  unlet g:imported_func
11106e587dcbSBram Moolenaar  unlet g:imported_name g:imported_name_appended
11118a7d6542SBram Moolenaar  delete('Ximport.vim')
1112f2d5c240SBram Moolenaar
11131c991144SBram Moolenaar  # similar, with line breaks
11141c991144SBram Moolenaar  let import_line_break_script_lines =<< trim END
11151c991144SBram Moolenaar    vim9script
11161c991144SBram Moolenaar    import {
11171c991144SBram Moolenaar        exported,
11181c991144SBram Moolenaar        Exported,
11191c991144SBram Moolenaar        }
11201c991144SBram Moolenaar        from
11211c991144SBram Moolenaar        './Xexport.vim'
11221c991144SBram Moolenaar    g:imported = exported
11231c991144SBram Moolenaar    exported += 5
11241c991144SBram Moolenaar    g:imported_added = exported
11251c991144SBram Moolenaar    g:imported_func = Exported()
11261c991144SBram Moolenaar  END
11271c991144SBram Moolenaar  writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
11281c991144SBram Moolenaar  source Ximport_lbr.vim
11291c991144SBram Moolenaar
11301c991144SBram Moolenaar  assert_equal(9876, g:imported)
11311c991144SBram Moolenaar  assert_equal(9881, g:imported_added)
11321c991144SBram Moolenaar  assert_equal('Exported', g:imported_func)
11331c991144SBram Moolenaar
11341c991144SBram Moolenaar  # exported script not sourced again
11351c991144SBram Moolenaar  assert_false(exists('g:result'))
11361c991144SBram Moolenaar  unlet g:imported
11371c991144SBram Moolenaar  unlet g:imported_added
11381c991144SBram Moolenaar  unlet g:imported_func
11391c991144SBram Moolenaar  delete('Ximport_lbr.vim')
11401c991144SBram Moolenaar
11411c991144SBram Moolenaar  # import inside :def function
11425381c7a1SBram Moolenaar  let import_in_def_lines =<< trim END
11435381c7a1SBram Moolenaar    vim9script
11445381c7a1SBram Moolenaar    def ImportInDef()
11455381c7a1SBram Moolenaar      import exported from './Xexport.vim'
11465381c7a1SBram Moolenaar      g:imported = exported
11475381c7a1SBram Moolenaar      exported += 7
11485381c7a1SBram Moolenaar      g:imported_added = exported
11495381c7a1SBram Moolenaar    enddef
11505381c7a1SBram Moolenaar    ImportInDef()
11515381c7a1SBram Moolenaar  END
11525381c7a1SBram Moolenaar  writefile(import_in_def_lines, 'Ximport2.vim')
11535381c7a1SBram Moolenaar  source Ximport2.vim
1154f5be8cdbSBram Moolenaar  # TODO: this should be 9879
11555381c7a1SBram Moolenaar  assert_equal(9876, g:imported)
11565381c7a1SBram Moolenaar  assert_equal(9883, g:imported_added)
11575381c7a1SBram Moolenaar  unlet g:imported
11585381c7a1SBram Moolenaar  unlet g:imported_added
11595381c7a1SBram Moolenaar  delete('Ximport2.vim')
11605381c7a1SBram Moolenaar
1161f2d5c240SBram Moolenaar  let import_star_as_lines =<< trim END
1162f2d5c240SBram Moolenaar    vim9script
1163f2d5c240SBram Moolenaar    import * as Export from './Xexport.vim'
1164f2d5c240SBram Moolenaar    def UseExport()
1165f2d5c240SBram Moolenaar      g:imported = Export.exported
1166f2d5c240SBram Moolenaar    enddef
1167f2d5c240SBram Moolenaar    UseExport()
1168f2d5c240SBram Moolenaar  END
1169f2d5c240SBram Moolenaar  writefile(import_star_as_lines, 'Ximport.vim')
1170f2d5c240SBram Moolenaar  source Ximport.vim
11715381c7a1SBram Moolenaar  assert_equal(9883, g:imported)
1172f2d5c240SBram Moolenaar
1173599c89c8SBram Moolenaar  let import_star_as_lines_no_dot =<< trim END
1174599c89c8SBram Moolenaar    vim9script
1175599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1176599c89c8SBram Moolenaar    def Func()
1177599c89c8SBram Moolenaar      let dummy = 1
1178599c89c8SBram Moolenaar      let imported = Export + dummy
1179599c89c8SBram Moolenaar    enddef
1180822ba247SBram Moolenaar    defcompile
1181599c89c8SBram Moolenaar  END
1182599c89c8SBram Moolenaar  writefile(import_star_as_lines_no_dot, 'Ximport.vim')
1183599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1060:')
1184599c89c8SBram Moolenaar
1185599c89c8SBram Moolenaar  let import_star_as_lines_dot_space =<< trim END
1186599c89c8SBram Moolenaar    vim9script
1187599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1188599c89c8SBram Moolenaar    def Func()
1189599c89c8SBram Moolenaar      let imported = Export . exported
1190599c89c8SBram Moolenaar    enddef
1191822ba247SBram Moolenaar    defcompile
1192599c89c8SBram Moolenaar  END
1193599c89c8SBram Moolenaar  writefile(import_star_as_lines_dot_space, 'Ximport.vim')
1194599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1074:')
1195599c89c8SBram Moolenaar
1196599c89c8SBram Moolenaar  let import_star_as_lines_missing_name =<< trim END
1197599c89c8SBram Moolenaar    vim9script
1198599c89c8SBram Moolenaar    import * as Export from './Xexport.vim'
1199599c89c8SBram Moolenaar    def Func()
1200599c89c8SBram Moolenaar      let imported = Export.
1201599c89c8SBram Moolenaar    enddef
1202822ba247SBram Moolenaar    defcompile
1203599c89c8SBram Moolenaar  END
1204599c89c8SBram Moolenaar  writefile(import_star_as_lines_missing_name, 'Ximport.vim')
1205599c89c8SBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1206599c89c8SBram Moolenaar
12071c991144SBram Moolenaar  let import_star_as_lbr_lines =<< trim END
12081c991144SBram Moolenaar    vim9script
12091c991144SBram Moolenaar    import *
12101c991144SBram Moolenaar        as Export
12111c991144SBram Moolenaar        from
12121c991144SBram Moolenaar        './Xexport.vim'
12131c991144SBram Moolenaar    def UseExport()
12141c991144SBram Moolenaar      g:imported = Export.exported
12151c991144SBram Moolenaar    enddef
12161c991144SBram Moolenaar    UseExport()
12171c991144SBram Moolenaar  END
12181c991144SBram Moolenaar  writefile(import_star_as_lbr_lines, 'Ximport.vim')
12191c991144SBram Moolenaar  source Ximport.vim
12201c991144SBram Moolenaar  assert_equal(9883, g:imported)
12211c991144SBram Moolenaar
1222f2d5c240SBram Moolenaar  let import_star_lines =<< trim END
1223f2d5c240SBram Moolenaar    vim9script
1224f2d5c240SBram Moolenaar    import * from './Xexport.vim'
1225f2d5c240SBram Moolenaar  END
1226f2d5c240SBram Moolenaar  writefile(import_star_lines, 'Ximport.vim')
1227f2d5c240SBram Moolenaar  assert_fails('source Ximport.vim', 'E1045:')
1228f2d5c240SBram Moolenaar
1229f5be8cdbSBram Moolenaar  # try to import something that exists but is not exported
1230fa29c8abSBram Moolenaar  let import_not_exported_lines =<< trim END
1231fa29c8abSBram Moolenaar    vim9script
1232fa29c8abSBram Moolenaar    import name from './Xexport.vim'
1233fa29c8abSBram Moolenaar  END
1234fa29c8abSBram Moolenaar  writefile(import_not_exported_lines, 'Ximport.vim')
1235fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1049:')
1236fa29c8abSBram Moolenaar
1237f5be8cdbSBram Moolenaar  # try to import something that is already defined
12385269bd2aSBram Moolenaar  let import_already_defined =<< trim END
12395269bd2aSBram Moolenaar    vim9script
12405269bd2aSBram Moolenaar    let exported = 'something'
12415269bd2aSBram Moolenaar    import exported from './Xexport.vim'
12425269bd2aSBram Moolenaar  END
12435269bd2aSBram Moolenaar  writefile(import_already_defined, 'Ximport.vim')
12445269bd2aSBram Moolenaar  assert_fails('source Ximport.vim', 'E1073:')
12455269bd2aSBram Moolenaar
1246f5be8cdbSBram Moolenaar  # try to import something that is already defined
12475269bd2aSBram Moolenaar  import_already_defined =<< trim END
12485269bd2aSBram Moolenaar    vim9script
12495269bd2aSBram Moolenaar    let exported = 'something'
12505269bd2aSBram Moolenaar    import * as 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 {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  # import a very long name, requires making a copy
1265fa29c8abSBram Moolenaar  let import_long_name_lines =<< trim END
1266fa29c8abSBram Moolenaar    vim9script
1267fa29c8abSBram Moolenaar    import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim'
1268fa29c8abSBram Moolenaar  END
1269fa29c8abSBram Moolenaar  writefile(import_long_name_lines, 'Ximport.vim')
1270fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1048:')
1271fa29c8abSBram Moolenaar
1272fa29c8abSBram Moolenaar  let import_no_from_lines =<< trim END
1273fa29c8abSBram Moolenaar    vim9script
1274fa29c8abSBram Moolenaar    import name './Xexport.vim'
1275fa29c8abSBram Moolenaar  END
1276fa29c8abSBram Moolenaar  writefile(import_no_from_lines, 'Ximport.vim')
1277fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1070:')
1278fa29c8abSBram Moolenaar
1279fa29c8abSBram Moolenaar  let import_invalid_string_lines =<< trim END
1280fa29c8abSBram Moolenaar    vim9script
1281fa29c8abSBram Moolenaar    import name from Xexport.vim
1282fa29c8abSBram Moolenaar  END
1283fa29c8abSBram Moolenaar  writefile(import_invalid_string_lines, 'Ximport.vim')
1284fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1071:')
1285fa29c8abSBram Moolenaar
1286fa29c8abSBram Moolenaar  let import_wrong_name_lines =<< trim END
1287fa29c8abSBram Moolenaar    vim9script
1288fa29c8abSBram Moolenaar    import name from './XnoExport.vim'
1289fa29c8abSBram Moolenaar  END
1290fa29c8abSBram Moolenaar  writefile(import_wrong_name_lines, 'Ximport.vim')
1291fa29c8abSBram Moolenaar  assert_fails('source Ximport.vim', 'E1053:')
1292fa29c8abSBram Moolenaar
1293fa29c8abSBram Moolenaar  let import_missing_comma_lines =<< trim END
1294fa29c8abSBram Moolenaar    vim9script
1295fa29c8abSBram Moolenaar    import {exported name} from './Xexport.vim'
1296fa29c8abSBram Moolenaar  END
12975269bd2aSBram Moolenaar  writefile(import_missing_comma_lines, 'Ximport3.vim')
12985269bd2aSBram Moolenaar  assert_fails('source Ximport3.vim', 'E1046:')
1299fa29c8abSBram Moolenaar
1300f2d5c240SBram Moolenaar  delete('Ximport.vim')
13015269bd2aSBram Moolenaar  delete('Ximport3.vim')
13028a7d6542SBram Moolenaar  delete('Xexport.vim')
13038a7d6542SBram Moolenaar
1304f5be8cdbSBram Moolenaar  # Check that in a Vim9 script 'cpo' is set to the Vim default.
1305750802b5SBram Moolenaar  set cpo&vi
1306750802b5SBram Moolenaar  let cpo_before = &cpo
1307750802b5SBram Moolenaar  let lines =<< trim END
1308750802b5SBram Moolenaar    vim9script
1309750802b5SBram Moolenaar    g:cpo_in_vim9script = &cpo
1310750802b5SBram Moolenaar  END
1311750802b5SBram Moolenaar  writefile(lines, 'Xvim9_script')
1312750802b5SBram Moolenaar  source Xvim9_script
1313750802b5SBram Moolenaar  assert_equal(cpo_before, &cpo)
1314750802b5SBram Moolenaar  set cpo&vim
1315750802b5SBram Moolenaar  assert_equal(&cpo, g:cpo_in_vim9script)
1316750802b5SBram Moolenaar  delete('Xvim9_script')
1317750802b5SBram Moolenaarenddef
1318750802b5SBram Moolenaar
1319750802b5SBram Moolenaardef Test_vim9script_fails()
13208a7d6542SBram Moolenaar  CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
13218a7d6542SBram Moolenaar  CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
1322750802b5SBram Moolenaar  CheckScriptFailure(['export let some = 123'], 'E1042:')
13239721fb4eSBram Moolenaar  CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:')
13249b7bf9e9SBram Moolenaar  CheckScriptFailure(['vim9script', 'export let g:some'], 'E1022:')
1325750802b5SBram Moolenaar  CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1326750802b5SBram Moolenaar
1327c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'let str: string', 'str = 1234'], 'E1013:')
1328c785b9a7SBram Moolenaar  CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:')
1329c785b9a7SBram Moolenaar
1330750802b5SBram Moolenaar  assert_fails('vim9script', 'E1038')
1331a26b9700SBram Moolenaar  assert_fails('export something', 'E1043')
13328a7d6542SBram Moolenaarenddef
13338a7d6542SBram Moolenaar
1334f7d267efSBram Moolenaarfunc Test_import_fails_without_script()
1335101f4810SBram Moolenaar  CheckRunVimInTerminal
1336101f4810SBram Moolenaar
13379bb3eb3eSBram Moolenaar  " call indirectly to avoid compilation error for missing functions
1338c620c055SBram Moolenaar  call Run_Test_import_fails_on_command_line()
13399bb3eb3eSBram Moolenaarendfunc
13409bb3eb3eSBram Moolenaar
1341c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line()
1342101f4810SBram Moolenaar  let export =<< trim END
1343101f4810SBram Moolenaar    vim9script
1344101f4810SBram Moolenaar    export def Foo(): number
1345101f4810SBram Moolenaar        return 0
1346101f4810SBram Moolenaar    enddef
1347101f4810SBram Moolenaar  END
13489bb3eb3eSBram Moolenaar  writefile(export, 'Xexport.vim')
1349101f4810SBram Moolenaar
13509bb3eb3eSBram Moolenaar  let buf = RunVimInTerminal('-c "import Foo from ''./Xexport.vim''"', #{
13519bb3eb3eSBram Moolenaar                rows: 6, wait_for_ruler: 0})
13529bb3eb3eSBram Moolenaar  WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))})
1353101f4810SBram Moolenaar
13549bb3eb3eSBram Moolenaar  delete('Xexport.vim')
13559bb3eb3eSBram Moolenaar  StopVimInTerminal(buf)
13569bb3eb3eSBram Moolenaarenddef
1357101f4810SBram Moolenaar
13584c17ad94SBram Moolenaardef Test_vim9script_reload_import()
13598a7d6542SBram Moolenaar  let lines =<< trim END
13608a7d6542SBram Moolenaar    vim9script
13618a7d6542SBram Moolenaar    const var = ''
13628a7d6542SBram Moolenaar    let valone = 1234
13638a7d6542SBram Moolenaar    def MyFunc(arg: string)
13648a7d6542SBram Moolenaar       valone = 5678
13658a7d6542SBram Moolenaar    enddef
13668a7d6542SBram Moolenaar  END
13678a7d6542SBram Moolenaar  let morelines =<< trim END
13688a7d6542SBram Moolenaar    let valtwo = 222
13698a7d6542SBram Moolenaar    export def GetValtwo(): number
13708a7d6542SBram Moolenaar      return valtwo
13718a7d6542SBram Moolenaar    enddef
13728a7d6542SBram Moolenaar  END
137303afdcf1SBram Moolenaar  writefile(lines + morelines, 'Xreload.vim')
13748a7d6542SBram Moolenaar  source Xreload.vim
13758a7d6542SBram Moolenaar  source Xreload.vim
13768a7d6542SBram Moolenaar  source Xreload.vim
13778a7d6542SBram Moolenaar
13788a7d6542SBram Moolenaar  let testlines =<< trim END
13798a7d6542SBram Moolenaar    vim9script
13808a7d6542SBram Moolenaar    def TheFunc()
13818a7d6542SBram Moolenaar      import GetValtwo from './Xreload.vim'
13828a7d6542SBram Moolenaar      assert_equal(222, GetValtwo())
13838a7d6542SBram Moolenaar    enddef
13848a7d6542SBram Moolenaar    TheFunc()
13858a7d6542SBram Moolenaar  END
13868a7d6542SBram Moolenaar  writefile(testlines, 'Ximport.vim')
13878a7d6542SBram Moolenaar  source Ximport.vim
13888a7d6542SBram Moolenaar
1389f5be8cdbSBram Moolenaar  # Test that when not using "morelines" GetValtwo() and valtwo are still
1390f5be8cdbSBram Moolenaar  # defined, because import doesn't reload a script.
13918a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
13928a7d6542SBram Moolenaar  source Ximport.vim
13938a7d6542SBram Moolenaar
1394f5be8cdbSBram Moolenaar  # cannot declare a var twice
13958a7d6542SBram Moolenaar  lines =<< trim END
13968a7d6542SBram Moolenaar    vim9script
13978a7d6542SBram Moolenaar    let valone = 1234
13988a7d6542SBram Moolenaar    let valone = 5678
13998a7d6542SBram Moolenaar  END
14008a7d6542SBram Moolenaar  writefile(lines, 'Xreload.vim')
14018a7d6542SBram Moolenaar  assert_fails('source Xreload.vim', 'E1041:')
14028a7d6542SBram Moolenaar
14038a7d6542SBram Moolenaar  delete('Xreload.vim')
14048a7d6542SBram Moolenaar  delete('Ximport.vim')
14058a7d6542SBram Moolenaarenddef
14068a7d6542SBram Moolenaar
1407fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the
1408fe465a01SBram Moolenaar" script-local name.
1409fe465a01SBram Moolenaardef Test_vim9script_funcref()
1410fe465a01SBram Moolenaar  let sortlines =<< trim END
1411fe465a01SBram Moolenaar      vim9script
1412fe465a01SBram Moolenaar      def Compare(i1: number, i2: number): number
1413bed36b93SBram Moolenaar        return i2 - i1
1414fe465a01SBram Moolenaar      enddef
1415fe465a01SBram Moolenaar
1416fe465a01SBram Moolenaar      export def FastSort(): list<number>
1417fe465a01SBram Moolenaar        return range(5)->sort(Compare)
1418fe465a01SBram Moolenaar      enddef
1419fe465a01SBram Moolenaar  END
1420fe465a01SBram Moolenaar  writefile(sortlines, 'Xsort.vim')
1421fe465a01SBram Moolenaar
1422fe465a01SBram Moolenaar  let lines =<< trim END
1423fe465a01SBram Moolenaar    vim9script
1424fe465a01SBram Moolenaar    import FastSort from './Xsort.vim'
1425fe465a01SBram Moolenaar    def Test()
1426fe465a01SBram Moolenaar      g:result = FastSort()
1427fe465a01SBram Moolenaar    enddef
1428fe465a01SBram Moolenaar    Test()
1429fe465a01SBram Moolenaar  END
1430fe465a01SBram Moolenaar  writefile(lines, 'Xscript.vim')
1431fe465a01SBram Moolenaar
1432fe465a01SBram Moolenaar  source Xscript.vim
1433fe465a01SBram Moolenaar  assert_equal([4, 3, 2, 1, 0], g:result)
1434fe465a01SBram Moolenaar
1435fe465a01SBram Moolenaar  unlet g:result
1436fe465a01SBram Moolenaar  delete('Xsort.vim')
1437fe465a01SBram Moolenaar  delete('Xscript.vim')
1438fe465a01SBram Moolenaarenddef
1439fe465a01SBram Moolenaar
1440c620c055SBram Moolenaar" Check that when searcing for "FilterFunc" it doesn't find the import in the
1441c620c055SBram Moolenaar" script where FastFilter() is called from.
1442c620c055SBram Moolenaardef Test_vim9script_funcref_other_script()
1443c620c055SBram Moolenaar  let filterLines =<< trim END
1444c620c055SBram Moolenaar    vim9script
1445c620c055SBram Moolenaar    export def FilterFunc(idx: number, val: number): bool
1446c620c055SBram Moolenaar      return idx % 2 == 1
1447c620c055SBram Moolenaar    enddef
1448c620c055SBram Moolenaar    export def FastFilter(): list<number>
1449c620c055SBram Moolenaar      return range(10)->filter('FilterFunc')
1450c620c055SBram Moolenaar    enddef
1451c620c055SBram Moolenaar  END
1452c620c055SBram Moolenaar  writefile(filterLines, 'Xfilter.vim')
1453c620c055SBram Moolenaar
1454c620c055SBram Moolenaar  let lines =<< trim END
1455c620c055SBram Moolenaar    vim9script
1456c620c055SBram Moolenaar    import {FilterFunc, FastFilter} from './Xfilter.vim'
1457c620c055SBram Moolenaar    def Test()
1458c620c055SBram Moolenaar      let x: list<number> = FastFilter()
1459c620c055SBram Moolenaar    enddef
1460c620c055SBram Moolenaar    Test()
1461c620c055SBram Moolenaar  END
1462c620c055SBram Moolenaar  writefile(lines, 'Ximport.vim')
1463c620c055SBram Moolenaar  assert_fails('source Ximport.vim', 'E121:')
1464c620c055SBram Moolenaar
1465c620c055SBram Moolenaar  delete('Xfilter.vim')
1466c620c055SBram Moolenaar  delete('Ximport.vim')
1467c620c055SBram Moolenaarenddef
1468c620c055SBram Moolenaar
14694c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc()
14704c17ad94SBram Moolenaar  let first_lines =<< trim END
14714c17ad94SBram Moolenaar    vim9script
14724c17ad94SBram Moolenaar    def FuncYes(): string
14734c17ad94SBram Moolenaar      return 'yes'
14744c17ad94SBram Moolenaar    enddef
14754c17ad94SBram Moolenaar  END
147603afdcf1SBram Moolenaar  let withno_lines =<< trim END
14774c17ad94SBram Moolenaar    def FuncNo(): string
14784c17ad94SBram Moolenaar      return 'no'
14794c17ad94SBram Moolenaar    enddef
14804c17ad94SBram Moolenaar    def g:DoCheck(no_exists: bool)
14814c17ad94SBram Moolenaar      assert_equal('yes', FuncYes())
14824c17ad94SBram Moolenaar      assert_equal('no', FuncNo())
148303afdcf1SBram Moolenaar    enddef
148403afdcf1SBram Moolenaar  END
148503afdcf1SBram Moolenaar  let nono_lines =<< trim END
148603afdcf1SBram Moolenaar    def g:DoCheck(no_exists: bool)
148703afdcf1SBram Moolenaar      assert_equal('yes', FuncYes())
14884c17ad94SBram Moolenaar      assert_fails('call FuncNo()', 'E117:')
14894c17ad94SBram Moolenaar    enddef
14904c17ad94SBram Moolenaar  END
14914c17ad94SBram Moolenaar
14924c17ad94SBram Moolenaar  # FuncNo() is defined
149303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
14944c17ad94SBram Moolenaar  source Xreloaded.vim
14954c17ad94SBram Moolenaar  g:DoCheck(true)
14964c17ad94SBram Moolenaar
14974c17ad94SBram Moolenaar  # FuncNo() is not redefined
149803afdcf1SBram Moolenaar  writefile(first_lines + nono_lines, 'Xreloaded.vim')
14994c17ad94SBram Moolenaar  source Xreloaded.vim
150003afdcf1SBram Moolenaar  g:DoCheck()
15014c17ad94SBram Moolenaar
15024c17ad94SBram Moolenaar  # FuncNo() is back
150303afdcf1SBram Moolenaar  writefile(first_lines + withno_lines, 'Xreloaded.vim')
15044c17ad94SBram Moolenaar  source Xreloaded.vim
150503afdcf1SBram Moolenaar  g:DoCheck()
15064c17ad94SBram Moolenaar
15074c17ad94SBram Moolenaar  delete('Xreloaded.vim')
15084c17ad94SBram Moolenaarenddef
15094c17ad94SBram Moolenaar
151089483d40SBram Moolenaardef Test_vim9script_reload_delvar()
151189483d40SBram Moolenaar  # write the script with a script-local variable
151289483d40SBram Moolenaar  let lines =<< trim END
151389483d40SBram Moolenaar    vim9script
151489483d40SBram Moolenaar    let var = 'string'
151589483d40SBram Moolenaar  END
151689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
151789483d40SBram Moolenaar  source XreloadVar.vim
151889483d40SBram Moolenaar
151989483d40SBram Moolenaar  # now write the script using the same variable locally - works
152089483d40SBram Moolenaar  lines =<< trim END
152189483d40SBram Moolenaar    vim9script
152289483d40SBram Moolenaar    def Func()
152389483d40SBram Moolenaar      let var = 'string'
152489483d40SBram Moolenaar    enddef
152589483d40SBram Moolenaar  END
152689483d40SBram Moolenaar  writefile(lines, 'XreloadVar.vim')
152789483d40SBram Moolenaar  source XreloadVar.vim
152889483d40SBram Moolenaar
152989483d40SBram Moolenaar  delete('XreloadVar.vim')
153089483d40SBram Moolenaarenddef
153189483d40SBram Moolenaar
15328a7d6542SBram Moolenaardef Test_import_absolute()
15338a7d6542SBram Moolenaar  let import_lines = [
1534e6085c53SBram Moolenaar        'vim9script',
1535e6085c53SBram Moolenaar        'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
1536e6085c53SBram Moolenaar        'def UseExported()',
1537e6085c53SBram Moolenaar        '  g:imported_abs = exported',
1538e6085c53SBram Moolenaar        '  exported = 8888',
1539e6085c53SBram Moolenaar        '  g:imported_after = exported',
1540e6085c53SBram Moolenaar        'enddef',
1541e6085c53SBram Moolenaar        'UseExported()',
1542e6085c53SBram Moolenaar        'g:import_disassembled = execute("disass UseExported")',
1543e6085c53SBram Moolenaar        ]
15448a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_abs.vim')
15458a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'Xexport_abs.vim')
15468a7d6542SBram Moolenaar
15478a7d6542SBram Moolenaar  source Ximport_abs.vim
15488a7d6542SBram Moolenaar
15498a7d6542SBram Moolenaar  assert_equal(9876, g:imported_abs)
15504e12a5dfSBram Moolenaar  assert_equal(8888, g:imported_after)
1551675f716eSBram Moolenaar  assert_match('<SNR>\d\+_UseExported.*' ..
1552675f716eSBram Moolenaar          'g:imported_abs = exported.*' ..
1553675f716eSBram Moolenaar          '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1554675f716eSBram Moolenaar          '1 STOREG g:imported_abs.*' ..
1555675f716eSBram Moolenaar          'exported = 8888.*' ..
1556675f716eSBram Moolenaar          '3 STORESCRIPT exported in .*Xexport_abs.vim.*' ..
1557675f716eSBram Moolenaar          'g:imported_after = exported.*' ..
1558675f716eSBram Moolenaar          '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' ..
1559675f716eSBram Moolenaar          '5 STOREG g:imported_after.*',
1560e6085c53SBram Moolenaar        g:import_disassembled)
15618a7d6542SBram Moolenaar  unlet g:imported_abs
15624e12a5dfSBram Moolenaar  unlet g:import_disassembled
15638a7d6542SBram Moolenaar
15648a7d6542SBram Moolenaar  delete('Ximport_abs.vim')
15658a7d6542SBram Moolenaar  delete('Xexport_abs.vim')
15668a7d6542SBram Moolenaarenddef
15678a7d6542SBram Moolenaar
15688a7d6542SBram Moolenaardef Test_import_rtp()
15698a7d6542SBram Moolenaar  let import_lines = [
1570e6085c53SBram Moolenaar        'vim9script',
1571e6085c53SBram Moolenaar        'import exported from "Xexport_rtp.vim"',
1572e6085c53SBram Moolenaar        'g:imported_rtp = exported',
1573e6085c53SBram Moolenaar        ]
15748a7d6542SBram Moolenaar  writefile(import_lines, 'Ximport_rtp.vim')
15758a7d6542SBram Moolenaar  mkdir('import')
15768a7d6542SBram Moolenaar  writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
15778a7d6542SBram Moolenaar
15788a7d6542SBram Moolenaar  let save_rtp = &rtp
15798a7d6542SBram Moolenaar  &rtp = getcwd()
15808a7d6542SBram Moolenaar  source Ximport_rtp.vim
15818a7d6542SBram Moolenaar  &rtp = save_rtp
15828a7d6542SBram Moolenaar
15838a7d6542SBram Moolenaar  assert_equal(9876, g:imported_rtp)
15848a7d6542SBram Moolenaar  unlet g:imported_rtp
15858a7d6542SBram Moolenaar
15868a7d6542SBram Moolenaar  delete('Ximport_rtp.vim')
158789483d40SBram Moolenaar  delete('import', 'rf')
15888a7d6542SBram Moolenaarenddef
15898a7d6542SBram Moolenaar
159025e0f586SBram Moolenaardef Test_import_compile_error()
159125e0f586SBram Moolenaar  let export_lines = [
159225e0f586SBram Moolenaar        'vim9script',
159325e0f586SBram Moolenaar        'export def ExpFunc(): string',
159425e0f586SBram Moolenaar        '  return notDefined',
159525e0f586SBram Moolenaar        'enddef',
159625e0f586SBram Moolenaar        ]
159725e0f586SBram Moolenaar  writefile(export_lines, 'Xexported.vim')
159825e0f586SBram Moolenaar
159925e0f586SBram Moolenaar  let import_lines = [
160025e0f586SBram Moolenaar        'vim9script',
160125e0f586SBram Moolenaar        'import ExpFunc from "./Xexported.vim"',
160225e0f586SBram Moolenaar        'def ImpFunc()',
160325e0f586SBram Moolenaar        '  echo ExpFunc()',
160425e0f586SBram Moolenaar        'enddef',
160525e0f586SBram Moolenaar        'defcompile',
160625e0f586SBram Moolenaar        ]
160725e0f586SBram Moolenaar  writefile(import_lines, 'Ximport.vim')
160825e0f586SBram Moolenaar
160925e0f586SBram Moolenaar  try
161025e0f586SBram Moolenaar    source Ximport.vim
161125e0f586SBram Moolenaar  catch /E1001/
1612f5be8cdbSBram Moolenaar    # Error should be fore the Xexported.vim file.
161325e0f586SBram Moolenaar    assert_match('E1001: variable not found: notDefined', v:exception)
161425e0f586SBram Moolenaar    assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
161525e0f586SBram Moolenaar  endtry
161625e0f586SBram Moolenaar
161725e0f586SBram Moolenaar  delete('Xexported.vim')
161825e0f586SBram Moolenaar  delete('Ximport.vim')
161925e0f586SBram Moolenaarenddef
162025e0f586SBram Moolenaar
1621eef2102eSBram Moolenaardef Test_func_overrules_import_fails()
1622eef2102eSBram Moolenaar  let export_lines =<< trim END
1623eef2102eSBram Moolenaar      vim9script
1624eef2102eSBram Moolenaar      export def Func()
1625eef2102eSBram Moolenaar        echo 'imported'
1626eef2102eSBram Moolenaar      enddef
1627eef2102eSBram Moolenaar  END
1628eef2102eSBram Moolenaar  writefile(export_lines, 'XexportedFunc.vim')
1629eef2102eSBram Moolenaar
1630eef2102eSBram Moolenaar  let lines =<< trim END
1631eef2102eSBram Moolenaar    vim9script
1632eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1633eef2102eSBram Moolenaar    def Func()
1634eef2102eSBram Moolenaar      echo 'local to function'
1635eef2102eSBram Moolenaar    enddef
1636eef2102eSBram Moolenaar  END
1637eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1638eef2102eSBram Moolenaar
1639eef2102eSBram Moolenaar  lines =<< trim END
1640eef2102eSBram Moolenaar    vim9script
1641eef2102eSBram Moolenaar    import Func from './XexportedFunc.vim'
1642eef2102eSBram Moolenaar    def Outer()
1643eef2102eSBram Moolenaar      def Func()
1644eef2102eSBram Moolenaar        echo 'local to function'
1645eef2102eSBram Moolenaar      enddef
1646eef2102eSBram Moolenaar    enddef
1647eef2102eSBram Moolenaar    defcompile
1648eef2102eSBram Moolenaar  END
1649eef2102eSBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1650eef2102eSBram Moolenaar
1651eef2102eSBram Moolenaar  delete('XexportedFunc.vim')
1652eef2102eSBram Moolenaarenddef
1653eef2102eSBram Moolenaar
1654*b9a2cac3SBram Moolenaardef Test_func_redefine_fails()
1655*b9a2cac3SBram Moolenaar  let lines =<< trim END
1656*b9a2cac3SBram Moolenaar    vim9script
1657*b9a2cac3SBram Moolenaar    def Func()
1658*b9a2cac3SBram Moolenaar      echo 'one'
1659*b9a2cac3SBram Moolenaar    enddef
1660*b9a2cac3SBram Moolenaar    def Func()
1661*b9a2cac3SBram Moolenaar      echo 'two'
1662*b9a2cac3SBram Moolenaar    enddef
1663*b9a2cac3SBram Moolenaar  END
1664*b9a2cac3SBram Moolenaar  CheckScriptFailure(lines, 'E1073:')
1665*b9a2cac3SBram Moolenaarenddef
1666*b9a2cac3SBram Moolenaar
16678a7d6542SBram Moolenaardef Test_fixed_size_list()
1668f5be8cdbSBram Moolenaar  # will be allocated as one piece of memory, check that changes work
16698a7d6542SBram Moolenaar  let l = [1, 2, 3, 4]
16708a7d6542SBram Moolenaar  l->remove(0)
16718a7d6542SBram Moolenaar  l->add(5)
16728a7d6542SBram Moolenaar  l->insert(99, 1)
16730f18b6d1SBram Moolenaar  assert_equal([2, 99, 3, 4, 5], l)
16748a7d6542SBram Moolenaarenddef
16758a7d6542SBram Moolenaar
1676ae616494SBram Moolenaardef Test_no_insert_xit()
1677ae616494SBram Moolenaar  call CheckDefExecFailure(['a = 1'], 'E1100:')
1678ae616494SBram Moolenaar  call CheckDefExecFailure(['c = 1'], 'E1100:')
1679f5a48010SBram Moolenaar  call CheckDefExecFailure(['i = 1'], 'E1100:')
1680f5a48010SBram Moolenaar  call CheckDefExecFailure(['t = 1'], 'E1100:')
1681f5a48010SBram Moolenaar  call CheckDefExecFailure(['x = 1'], 'E1100:')
1682ae616494SBram Moolenaar
1683ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a = 1'], 'E488:')
1684ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'a'], 'E1100:')
1685ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c = 1'], 'E488:')
1686ae616494SBram Moolenaar  CheckScriptFailure(['vim9script', 'c'], 'E1100:')
1687f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i = 1'], 'E488:')
1688f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'i'], 'E1100:')
1689f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't'], 'E1100:')
1690f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 't = 1'], 'E1100:')
1691f5a48010SBram Moolenaar  CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:')
1692ae616494SBram Moolenaarenddef
1693ae616494SBram Moolenaar
1694158906cfSBram Moolenaardef IfElse(what: number): string
1695158906cfSBram Moolenaar  let res = ''
1696158906cfSBram Moolenaar  if what == 1
1697158906cfSBram Moolenaar    res = "one"
1698158906cfSBram Moolenaar  elseif what == 2
1699158906cfSBram Moolenaar    res = "two"
1700a259d8d3SBram Moolenaar  else
1701158906cfSBram Moolenaar    res = "three"
1702a259d8d3SBram Moolenaar  endif
1703158906cfSBram Moolenaar  return res
1704a259d8d3SBram Moolenaarenddef
1705a259d8d3SBram Moolenaar
1706158906cfSBram Moolenaardef Test_if_elseif_else()
1707158906cfSBram Moolenaar  assert_equal('one', IfElse(1))
1708158906cfSBram Moolenaar  assert_equal('two', IfElse(2))
1709158906cfSBram Moolenaar  assert_equal('three', IfElse(3))
17100f18b6d1SBram Moolenaarenddef
17110f18b6d1SBram Moolenaar
1712e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails()
1713e8c4abbbSBram Moolenaar  call CheckDefFailure(['elseif true'], 'E582:')
1714e8c4abbbSBram Moolenaar  call CheckDefFailure(['else'], 'E581:')
1715e8c4abbbSBram Moolenaar  call CheckDefFailure(['endif'], 'E580:')
1716e8c4abbbSBram Moolenaar  call CheckDefFailure(['if true', 'elseif xxx'], 'E1001:')
1717585fea7bSBram Moolenaar  call CheckDefFailure(['if true', 'echo 1'], 'E171:')
1718e8c4abbbSBram Moolenaarenddef
1719e8c4abbbSBram Moolenaar
17206d69bf60SBram Moolenaarlet g:bool_true = v:true
17216d69bf60SBram Moolenaarlet g:bool_false = v:false
17226d69bf60SBram Moolenaar
17236d69bf60SBram Moolenaardef Test_if_const_expr()
17246d69bf60SBram Moolenaar  let res = false
17256d69bf60SBram Moolenaar  if true ? true : false
17266d69bf60SBram Moolenaar    res = true
17276d69bf60SBram Moolenaar  endif
17286d69bf60SBram Moolenaar  assert_equal(true, res)
17296d69bf60SBram Moolenaar
1730585fea7bSBram Moolenaar  g:glob = 2
1731585fea7bSBram Moolenaar  if false
17326797966dSBram Moolenaar    execute('g:glob = 3')
1733585fea7bSBram Moolenaar  endif
1734585fea7bSBram Moolenaar  assert_equal(2, g:glob)
1735585fea7bSBram Moolenaar  if true
17366797966dSBram Moolenaar    execute('g:glob = 3')
1737585fea7bSBram Moolenaar  endif
1738585fea7bSBram Moolenaar  assert_equal(3, g:glob)
1739585fea7bSBram Moolenaar
17406d69bf60SBram Moolenaar  res = false
17416d69bf60SBram Moolenaar  if g:bool_true ? true : false
17426d69bf60SBram Moolenaar    res = true
17436d69bf60SBram Moolenaar  endif
17446d69bf60SBram Moolenaar  assert_equal(true, res)
17456d69bf60SBram Moolenaar
17466d69bf60SBram Moolenaar  res = false
17476d69bf60SBram Moolenaar  if true ? g:bool_true : false
17486d69bf60SBram Moolenaar    res = true
17496d69bf60SBram Moolenaar  endif
17506d69bf60SBram Moolenaar  assert_equal(true, res)
17516d69bf60SBram Moolenaar
17526d69bf60SBram Moolenaar  res = false
17536d69bf60SBram Moolenaar  if true ? true : g:bool_false
17546d69bf60SBram Moolenaar    res = true
17556d69bf60SBram Moolenaar  endif
17566d69bf60SBram Moolenaar  assert_equal(true, res)
17576d69bf60SBram Moolenaar
17586d69bf60SBram Moolenaar  res = false
17596d69bf60SBram Moolenaar  if true ? false : true
17606d69bf60SBram Moolenaar    res = true
17616d69bf60SBram Moolenaar  endif
17626d69bf60SBram Moolenaar  assert_equal(false, res)
17636d69bf60SBram Moolenaar
17646d69bf60SBram Moolenaar  res = false
17656d69bf60SBram Moolenaar  if false ? false : true
17666d69bf60SBram Moolenaar    res = true
17676d69bf60SBram Moolenaar  endif
17686d69bf60SBram Moolenaar  assert_equal(true, res)
17696d69bf60SBram Moolenaar
17706d69bf60SBram Moolenaar  res = false
17716d69bf60SBram Moolenaar  if false ? true : false
17726d69bf60SBram Moolenaar    res = true
17736d69bf60SBram Moolenaar  endif
17746d69bf60SBram Moolenaar  assert_equal(false, res)
17756d69bf60SBram Moolenaar
17766d69bf60SBram Moolenaar  res = false
1777e8c4abbbSBram Moolenaar  if has('xyz') ? true : false
1778e8c4abbbSBram Moolenaar    res = true
1779e8c4abbbSBram Moolenaar  endif
1780e8c4abbbSBram Moolenaar  assert_equal(false, res)
1781e8c4abbbSBram Moolenaar
1782e8c4abbbSBram Moolenaar  res = false
17836d69bf60SBram Moolenaar  if true && true
17846d69bf60SBram Moolenaar    res = true
17856d69bf60SBram Moolenaar  endif
17866d69bf60SBram Moolenaar  assert_equal(true, res)
17876d69bf60SBram Moolenaar
17886d69bf60SBram Moolenaar  res = false
17896d69bf60SBram Moolenaar  if true && false
17906d69bf60SBram Moolenaar    res = true
17916d69bf60SBram Moolenaar  endif
17926d69bf60SBram Moolenaar  assert_equal(false, res)
17936d69bf60SBram Moolenaar
17946d69bf60SBram Moolenaar  res = false
17956d69bf60SBram Moolenaar  if g:bool_true && false
17966d69bf60SBram Moolenaar    res = true
17976d69bf60SBram Moolenaar  endif
17986d69bf60SBram Moolenaar  assert_equal(false, res)
17996d69bf60SBram Moolenaar
18006d69bf60SBram Moolenaar  res = false
18016d69bf60SBram Moolenaar  if true && g:bool_false
18026d69bf60SBram Moolenaar    res = true
18036d69bf60SBram Moolenaar  endif
18046d69bf60SBram Moolenaar  assert_equal(false, res)
18056d69bf60SBram Moolenaar
18066d69bf60SBram Moolenaar  res = false
18076d69bf60SBram Moolenaar  if false && false
18086d69bf60SBram Moolenaar    res = true
18096d69bf60SBram Moolenaar  endif
18106d69bf60SBram Moolenaar  assert_equal(false, res)
18116d69bf60SBram Moolenaar
18126d69bf60SBram Moolenaar  res = false
18136d69bf60SBram Moolenaar  if true || false
18146d69bf60SBram Moolenaar    res = true
18156d69bf60SBram Moolenaar  endif
18166d69bf60SBram Moolenaar  assert_equal(true, res)
18176d69bf60SBram Moolenaar
18186d69bf60SBram Moolenaar  res = false
18196d69bf60SBram Moolenaar  if g:bool_true || false
18206d69bf60SBram Moolenaar    res = true
18216d69bf60SBram Moolenaar  endif
18226d69bf60SBram Moolenaar  assert_equal(true, res)
18236d69bf60SBram Moolenaar
18246d69bf60SBram Moolenaar  res = false
18256d69bf60SBram Moolenaar  if true || g:bool_false
18266d69bf60SBram Moolenaar    res = true
18276d69bf60SBram Moolenaar  endif
18286d69bf60SBram Moolenaar  assert_equal(true, res)
18296d69bf60SBram Moolenaar
18306d69bf60SBram Moolenaar  res = false
18316d69bf60SBram Moolenaar  if false || false
18326d69bf60SBram Moolenaar    res = true
18336d69bf60SBram Moolenaar  endif
18346d69bf60SBram Moolenaar  assert_equal(false, res)
183580c34ca3SBram Moolenaarenddef
18366d69bf60SBram Moolenaar
183780c34ca3SBram Moolenaardef Test_if_const_expr_fails()
183880c34ca3SBram Moolenaar  call CheckDefFailure(['if "aaa" == "bbb'], 'E114:')
183980c34ca3SBram Moolenaar  call CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:')
1840e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa'"], 'E110:')
1841e8c4abbbSBram Moolenaar  call CheckDefFailure(["if has('aaa') ? true false"], 'E109:')
18426d69bf60SBram Moolenaarenddef
18436d69bf60SBram Moolenaar
184472abcf42SBram Moolenaardef RunNested(i: number): number
184572abcf42SBram Moolenaar  let x: number = 0
184672abcf42SBram Moolenaar  if i % 2
184772abcf42SBram Moolenaar    if 1
1848f5be8cdbSBram Moolenaar      # comment
184972abcf42SBram Moolenaar    else
1850f5be8cdbSBram Moolenaar      # comment
185172abcf42SBram Moolenaar    endif
185272abcf42SBram Moolenaar    x += 1
185372abcf42SBram Moolenaar  else
185472abcf42SBram Moolenaar    x += 1000
185572abcf42SBram Moolenaar  endif
185672abcf42SBram Moolenaar  return x
185772abcf42SBram Moolenaarenddef
185872abcf42SBram Moolenaar
185972abcf42SBram Moolenaardef Test_nested_if()
186072abcf42SBram Moolenaar  assert_equal(1, RunNested(1))
186172abcf42SBram Moolenaar  assert_equal(1000, RunNested(2))
186272abcf42SBram Moolenaarenddef
186372abcf42SBram Moolenaar
1864ad39c094SBram Moolenaardef Test_execute_cmd()
1865ad39c094SBram Moolenaar  new
1866ad39c094SBram Moolenaar  setline(1, 'default')
1867ad39c094SBram Moolenaar  execute 'call setline(1, "execute-string")'
1868ad39c094SBram Moolenaar  assert_equal('execute-string', getline(1))
1869a72cfb80SBram Moolenaar
1870a72cfb80SBram Moolenaar  execute "call setline(1, 'execute-string')"
1871a72cfb80SBram Moolenaar  assert_equal('execute-string', getline(1))
1872a72cfb80SBram Moolenaar
1873ad39c094SBram Moolenaar  let cmd1 = 'call setline(1,'
1874ad39c094SBram Moolenaar  let cmd2 = '"execute-var")'
1875a72cfb80SBram Moolenaar  execute cmd1 cmd2 # comment
1876ad39c094SBram Moolenaar  assert_equal('execute-var', getline(1))
1877a72cfb80SBram Moolenaar
1878ad39c094SBram Moolenaar  execute cmd1 cmd2 '|call setline(1, "execute-var-string")'
1879ad39c094SBram Moolenaar  assert_equal('execute-var-string', getline(1))
1880a72cfb80SBram Moolenaar
1881ad39c094SBram Moolenaar  let cmd_first = 'call '
1882ad39c094SBram Moolenaar  let cmd_last = 'setline(1, "execute-var-var")'
1883ad39c094SBram Moolenaar  execute cmd_first .. cmd_last
1884ad39c094SBram Moolenaar  assert_equal('execute-var-var', getline(1))
1885ad39c094SBram Moolenaar  bwipe!
1886585fea7bSBram Moolenaar
18872d6b20d6SBram Moolenaar  let n = true
18882d6b20d6SBram Moolenaar  execute 'echomsg' (n ? '"true"' : '"no"')
18892d6b20d6SBram Moolenaar  assert_match('^true$', Screenline(&lines))
18902d6b20d6SBram Moolenaar
1891585fea7bSBram Moolenaar  call CheckDefFailure(['execute xxx'], 'E1001:')
1892a72cfb80SBram Moolenaar  call CheckDefFailure(['execute "cmd"# comment'], 'E488:')
1893ad39c094SBram Moolenaarenddef
1894ad39c094SBram Moolenaar
189547e880d6SBram Moolenaardef Test_execute_cmd_vimscript()
1896f5be8cdbSBram Moolenaar  # only checks line continuation
189747e880d6SBram Moolenaar  let lines =<< trim END
189847e880d6SBram Moolenaar      vim9script
189947e880d6SBram Moolenaar      execute 'g:someVar'
190047e880d6SBram Moolenaar                .. ' = ' ..
190147e880d6SBram Moolenaar                   '28'
190247e880d6SBram Moolenaar      assert_equal(28, g:someVar)
190347e880d6SBram Moolenaar      unlet g:someVar
190447e880d6SBram Moolenaar  END
190547e880d6SBram Moolenaar  CheckScriptSuccess(lines)
190647e880d6SBram Moolenaarenddef
190747e880d6SBram Moolenaar
1908ad39c094SBram Moolenaardef Test_echo_cmd()
1909a72cfb80SBram Moolenaar  echo 'some' # comment
1910585fea7bSBram Moolenaar  echon 'thing'
1911ad39c094SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1912ad39c094SBram Moolenaar
1913a72cfb80SBram Moolenaar  echo "some" # comment
1914a72cfb80SBram Moolenaar  echon "thing"
1915a72cfb80SBram Moolenaar  assert_match('^something$', Screenline(&lines))
1916a72cfb80SBram Moolenaar
1917ad39c094SBram Moolenaar  let str1 = 'some'
1918ad39c094SBram Moolenaar  let str2 = 'more'
1919ad39c094SBram Moolenaar  echo str1 str2
1920ad39c094SBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1921a72cfb80SBram Moolenaar
1922a72cfb80SBram Moolenaar  call CheckDefFailure(['echo "xxx"# comment'], 'E488:')
1923ad39c094SBram Moolenaarenddef
1924ad39c094SBram Moolenaar
1925f93c7feaSBram Moolenaardef Test_echomsg_cmd()
1926f93c7feaSBram Moolenaar  echomsg 'some' 'more' # comment
1927f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1928f93c7feaSBram Moolenaar  echo 'clear'
1929df069eecSBram Moolenaar  :1messages
1930f93c7feaSBram Moolenaar  assert_match('^some more$', Screenline(&lines))
1931f93c7feaSBram Moolenaar
1932f93c7feaSBram Moolenaar  call CheckDefFailure(['echomsg "xxx"# comment'], 'E488:')
1933f93c7feaSBram Moolenaarenddef
1934f93c7feaSBram Moolenaar
193547e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript()
1936f5be8cdbSBram Moolenaar  # only checks line continuation
193747e880d6SBram Moolenaar  let lines =<< trim END
193847e880d6SBram Moolenaar      vim9script
193947e880d6SBram Moolenaar      echomsg 'here'
194047e880d6SBram Moolenaar                .. ' is ' ..
194147e880d6SBram Moolenaar                   'a message'
194247e880d6SBram Moolenaar      assert_match('^here is a message$', Screenline(&lines))
194347e880d6SBram Moolenaar  END
194447e880d6SBram Moolenaar  CheckScriptSuccess(lines)
194547e880d6SBram Moolenaarenddef
194647e880d6SBram Moolenaar
1947f93c7feaSBram Moolenaardef Test_echoerr_cmd()
194840ee466cSBram Moolenaar  try
194940ee466cSBram Moolenaar    echoerr 'something' 'wrong' # comment
195040ee466cSBram Moolenaar  catch
195140ee466cSBram Moolenaar    assert_match('something wrong', v:exception)
195240ee466cSBram Moolenaar  endtry
1953f93c7feaSBram Moolenaarenddef
1954f93c7feaSBram Moolenaar
195547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript()
1956f5be8cdbSBram Moolenaar  # only checks line continuation
195747e880d6SBram Moolenaar  let lines =<< trim END
195847e880d6SBram Moolenaar      vim9script
195947e880d6SBram Moolenaar      try
196047e880d6SBram Moolenaar        echoerr 'this'
196147e880d6SBram Moolenaar                .. ' is ' ..
196247e880d6SBram Moolenaar                   'wrong'
196347e880d6SBram Moolenaar      catch
196447e880d6SBram Moolenaar        assert_match('this is wrong', v:exception)
196547e880d6SBram Moolenaar      endtry
196647e880d6SBram Moolenaar  END
196747e880d6SBram Moolenaar  CheckScriptSuccess(lines)
196847e880d6SBram Moolenaarenddef
196947e880d6SBram Moolenaar
197041fe0617SBram Moolenaardef Test_for_outside_of_function()
197141fe0617SBram Moolenaar  let lines =<< trim END
197241fe0617SBram Moolenaar    vim9script
197341fe0617SBram Moolenaar    new
197441fe0617SBram Moolenaar    for var in range(0, 3)
197541fe0617SBram Moolenaar      append(line('$'), var)
197641fe0617SBram Moolenaar    endfor
197741fe0617SBram Moolenaar    assert_equal(['', '0', '1', '2', '3'], getline(1, '$'))
197841fe0617SBram Moolenaar    bwipe!
197941fe0617SBram Moolenaar  END
198041fe0617SBram Moolenaar  writefile(lines, 'Xvim9for.vim')
198141fe0617SBram Moolenaar  source Xvim9for.vim
198241fe0617SBram Moolenaar  delete('Xvim9for.vim')
198341fe0617SBram Moolenaarenddef
19848a7d6542SBram Moolenaar
1985e8c4abbbSBram Moolenaardef Test_for_loop()
1986e8c4abbbSBram Moolenaar  let result = ''
1987e8c4abbbSBram Moolenaar  for cnt in range(7)
1988e8c4abbbSBram Moolenaar    if cnt == 4
1989e8c4abbbSBram Moolenaar      break
1990e8c4abbbSBram Moolenaar    endif
1991e8c4abbbSBram Moolenaar    if cnt == 2
1992e8c4abbbSBram Moolenaar      continue
1993e8c4abbbSBram Moolenaar    endif
1994e8c4abbbSBram Moolenaar    result ..= cnt .. '_'
1995e8c4abbbSBram Moolenaar  endfor
1996e8c4abbbSBram Moolenaar  assert_equal('0_1_3_', result)
19970ad3e894SBram Moolenaar
19980ad3e894SBram Moolenaar  let concat = ''
19990ad3e894SBram Moolenaar  for str in eval('["one", "two"]')
20000ad3e894SBram Moolenaar    concat ..= str
20010ad3e894SBram Moolenaar  endfor
20020ad3e894SBram Moolenaar  assert_equal('onetwo', concat)
2003e8c4abbbSBram Moolenaarenddef
2004e8c4abbbSBram Moolenaar
2005e8c4abbbSBram Moolenaardef Test_for_loop_fails()
2006675f716eSBram Moolenaar  CheckDefFailure(['for # in range(5)'], 'E690:')
2007675f716eSBram Moolenaar  CheckDefFailure(['for i In range(5)'], 'E690:')
2008675f716eSBram Moolenaar  CheckDefFailure(['let x = 5', 'for x in range(5)'], 'E1023:')
2009822ba247SBram Moolenaar  CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:')
20100ad3e894SBram Moolenaar  CheckDefFailure(['for i in "text"'], 'E1013:')
2011675f716eSBram Moolenaar  CheckDefFailure(['for i in xxx'], 'E1001:')
2012675f716eSBram Moolenaar  CheckDefFailure(['endfor'], 'E588:')
2013675f716eSBram Moolenaar  CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:')
2014e8c4abbbSBram Moolenaarenddef
2015e8c4abbbSBram Moolenaar
2016d0df1aacSBram Moolenaardef Test_while_loop()
2017d0df1aacSBram Moolenaar  let result = ''
2018d0df1aacSBram Moolenaar  let cnt = 0
2019d0df1aacSBram Moolenaar  while cnt < 555
2020d0df1aacSBram Moolenaar    if cnt == 3
2021d0df1aacSBram Moolenaar      break
2022d0df1aacSBram Moolenaar    endif
2023d0df1aacSBram Moolenaar    cnt += 1
2024d0df1aacSBram Moolenaar    if cnt == 2
2025d0df1aacSBram Moolenaar      continue
2026d0df1aacSBram Moolenaar    endif
2027d0df1aacSBram Moolenaar    result ..= cnt .. '_'
2028d0df1aacSBram Moolenaar  endwhile
2029d0df1aacSBram Moolenaar  assert_equal('1_3_', result)
2030d0df1aacSBram Moolenaarenddef
2031d0df1aacSBram Moolenaar
2032e8c4abbbSBram Moolenaardef Test_while_loop_fails()
2033675f716eSBram Moolenaar  CheckDefFailure(['while xxx'], 'E1001:')
2034675f716eSBram Moolenaar  CheckDefFailure(['endwhile'], 'E588:')
2035675f716eSBram Moolenaar  CheckDefFailure(['continue'], 'E586:')
2036675f716eSBram Moolenaar  CheckDefFailure(['if true', 'continue'], 'E586:')
2037675f716eSBram Moolenaar  CheckDefFailure(['break'], 'E587:')
2038675f716eSBram Moolenaar  CheckDefFailure(['if true', 'break'], 'E587:')
2039675f716eSBram Moolenaar  CheckDefFailure(['while 1', 'echo 3'], 'E170:')
2040bd5da371SBram Moolenaarenddef
2041bd5da371SBram Moolenaar
20429645e2d9SBram Moolenaardef Test_interrupt_loop()
204397acfc78SBram Moolenaar  let caught = false
20449645e2d9SBram Moolenaar  let x = 0
204597acfc78SBram Moolenaar  try
20469645e2d9SBram Moolenaar    while 1
20479645e2d9SBram Moolenaar      x += 1
20489645e2d9SBram Moolenaar      if x == 100
20499645e2d9SBram Moolenaar        feedkeys("\<C-C>", 'Lt')
20509645e2d9SBram Moolenaar      endif
20519645e2d9SBram Moolenaar    endwhile
205297acfc78SBram Moolenaar  catch
205397acfc78SBram Moolenaar    caught = true
205497acfc78SBram Moolenaar    assert_equal(100, x)
205597acfc78SBram Moolenaar  endtry
205697acfc78SBram Moolenaar  assert_true(caught, 'should have caught an exception')
20579645e2d9SBram Moolenaarenddef
205820431c9dSBram Moolenaar
20594fdae999SBram Moolenaardef Test_automatic_line_continuation()
20604fdae999SBram Moolenaar  let mylist = [
20614fdae999SBram Moolenaar      'one',
20624fdae999SBram Moolenaar      'two',
20634fdae999SBram Moolenaar      'three',
2064f5be8cdbSBram Moolenaar      ] # comment
20654fdae999SBram Moolenaar  assert_equal(['one', 'two', 'three'], mylist)
20664fdae999SBram Moolenaar
20674fdae999SBram Moolenaar  let mydict = {
20684fdae999SBram Moolenaar      'one': 1,
20694fdae999SBram Moolenaar      'two': 2,
20704fdae999SBram Moolenaar      'three':
20714fdae999SBram Moolenaar          3,
2072f5be8cdbSBram Moolenaar      } # comment
20734fdae999SBram Moolenaar  assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict)
20744fdae999SBram Moolenaar  mydict = #{
20752c330432SBram Moolenaar      one: 1,  # comment
20762c330432SBram Moolenaar      two:     # comment
20772c330432SBram Moolenaar           2,  # comment
20782c330432SBram Moolenaar      three: 3 # comment
20792c330432SBram Moolenaar      }
20802c330432SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
20812c330432SBram Moolenaar  mydict = #{
20822c330432SBram Moolenaar      one: 1,
20834fdae999SBram Moolenaar      two:
20844fdae999SBram Moolenaar           2,
20852c330432SBram Moolenaar      three: 3
20864fdae999SBram Moolenaar      }
20874fdae999SBram Moolenaar  assert_equal(#{one: 1, two: 2, three: 3}, mydict)
2088e6085c53SBram Moolenaar
2089e6085c53SBram Moolenaar  assert_equal(
2090e6085c53SBram Moolenaar        ['one', 'two', 'three'],
2091e6085c53SBram Moolenaar        split('one two three')
2092e6085c53SBram Moolenaar        )
20934fdae999SBram Moolenaarenddef
20944fdae999SBram Moolenaar
20957a092245SBram Moolenaardef Test_vim9_comment()
20967a092245SBram Moolenaar  CheckScriptSuccess([
20977a092245SBram Moolenaar      'vim9script',
20987a092245SBram Moolenaar      '# something',
20997a092245SBram Moolenaar      ])
21007a092245SBram Moolenaar  CheckScriptFailure([
21017a092245SBram Moolenaar      'vim9script',
21027a092245SBram Moolenaar      ':# something',
21037a092245SBram Moolenaar      ], 'E488:')
21047a092245SBram Moolenaar  CheckScriptFailure([
21057a092245SBram Moolenaar      '# something',
21067a092245SBram Moolenaar      ], 'E488:')
21077a092245SBram Moolenaar  CheckScriptFailure([
21087a092245SBram Moolenaar      ':# something',
21097a092245SBram Moolenaar      ], 'E488:')
21107a092245SBram Moolenaar
21114a8d9f2eSBram Moolenaar  { # block start
21124a8d9f2eSBram Moolenaar  } # block end
21134a8d9f2eSBram Moolenaar  CheckDefFailure([
21144a8d9f2eSBram Moolenaar      '{# comment',
21154a8d9f2eSBram Moolenaar      ], 'E488:')
21164a8d9f2eSBram Moolenaar  CheckDefFailure([
21174a8d9f2eSBram Moolenaar      '{',
21184a8d9f2eSBram Moolenaar      '}# comment',
21194a8d9f2eSBram Moolenaar      ], 'E488:')
21204a8d9f2eSBram Moolenaar
21214a8d9f2eSBram Moolenaar  echo "yes" # comment
21224a8d9f2eSBram Moolenaar  CheckDefFailure([
21234a8d9f2eSBram Moolenaar      'echo "yes"# comment',
21244a8d9f2eSBram Moolenaar      ], 'E488:')
21257a092245SBram Moolenaar  CheckScriptSuccess([
21267a092245SBram Moolenaar      'vim9script',
21277a092245SBram Moolenaar      'echo "yes" # something',
21287a092245SBram Moolenaar      ])
21297a092245SBram Moolenaar  CheckScriptFailure([
21307a092245SBram Moolenaar      'vim9script',
21317a092245SBram Moolenaar      'echo "yes"# something',
21327a092245SBram Moolenaar      ], 'E121:')
21337a092245SBram Moolenaar  CheckScriptFailure([
21347a092245SBram Moolenaar      'vim9script',
21357a092245SBram Moolenaar      'echo# something',
21367a092245SBram Moolenaar      ], 'E121:')
21377a092245SBram Moolenaar  CheckScriptFailure([
21387a092245SBram Moolenaar      'echo "yes" # something',
21397a092245SBram Moolenaar      ], 'E121:')
21407a092245SBram Moolenaar
21414a8d9f2eSBram Moolenaar  exe "echo" # comment
21424a8d9f2eSBram Moolenaar  CheckDefFailure([
21434a8d9f2eSBram Moolenaar      'exe "echo"# comment',
21444a8d9f2eSBram Moolenaar      ], 'E488:')
21454a8d9f2eSBram Moolenaar  CheckScriptSuccess([
21464a8d9f2eSBram Moolenaar      'vim9script',
21474a8d9f2eSBram Moolenaar      'exe "echo" # something',
21484a8d9f2eSBram Moolenaar      ])
21494a8d9f2eSBram Moolenaar  CheckScriptFailure([
21504a8d9f2eSBram Moolenaar      'vim9script',
21514a8d9f2eSBram Moolenaar      'exe "echo"# something',
21524a8d9f2eSBram Moolenaar      ], 'E121:')
21534a8d9f2eSBram Moolenaar  CheckDefFailure([
21544a8d9f2eSBram Moolenaar      'exe # comment',
21554a8d9f2eSBram Moolenaar      ], 'E1015:')
21564a8d9f2eSBram Moolenaar  CheckScriptFailure([
21574a8d9f2eSBram Moolenaar      'vim9script',
21584a8d9f2eSBram Moolenaar      'exe# something',
21594a8d9f2eSBram Moolenaar      ], 'E121:')
21604a8d9f2eSBram Moolenaar  CheckScriptFailure([
21614a8d9f2eSBram Moolenaar      'exe "echo" # something',
21624a8d9f2eSBram Moolenaar      ], 'E121:')
21634a8d9f2eSBram Moolenaar
21647a092245SBram Moolenaar  CheckDefFailure([
21657a092245SBram Moolenaar      'try# comment',
21667a092245SBram Moolenaar      '  echo "yes"',
21677a092245SBram Moolenaar      'catch',
21687a092245SBram Moolenaar      'endtry',
21697a092245SBram Moolenaar      ], 'E488:')
21702c5ed4e3SBram Moolenaar  CheckScriptFailure([
21712c5ed4e3SBram Moolenaar      'vim9script',
21722c5ed4e3SBram Moolenaar      'try# comment',
21732c5ed4e3SBram Moolenaar      'echo "yes"',
21742c5ed4e3SBram Moolenaar      ], 'E488:')
21757a092245SBram Moolenaar  CheckDefFailure([
21767a092245SBram Moolenaar      'try',
2177a72cfb80SBram Moolenaar      '  throw#comment',
2178a72cfb80SBram Moolenaar      'catch',
2179a72cfb80SBram Moolenaar      'endtry',
2180a72cfb80SBram Moolenaar      ], 'E1015:')
2181a72cfb80SBram Moolenaar  CheckDefFailure([
2182a72cfb80SBram Moolenaar      'try',
2183a72cfb80SBram Moolenaar      '  throw "yes"#comment',
2184a72cfb80SBram Moolenaar      'catch',
2185a72cfb80SBram Moolenaar      'endtry',
2186a72cfb80SBram Moolenaar      ], 'E488:')
2187a72cfb80SBram Moolenaar  CheckDefFailure([
2188a72cfb80SBram Moolenaar      'try',
21897a092245SBram Moolenaar      '  echo "yes"',
21907a092245SBram Moolenaar      'catch# comment',
21917a092245SBram Moolenaar      'endtry',
21927a092245SBram Moolenaar      ], 'E488:')
21932c5ed4e3SBram Moolenaar  CheckScriptFailure([
21942c5ed4e3SBram Moolenaar      'vim9script',
21952c5ed4e3SBram Moolenaar      'try',
21962c5ed4e3SBram Moolenaar      '  echo "yes"',
21972c5ed4e3SBram Moolenaar      'catch# comment',
21982c5ed4e3SBram Moolenaar      'endtry',
21992c5ed4e3SBram Moolenaar      ], 'E654:')
22002c5ed4e3SBram Moolenaar  CheckDefFailure([
22012c5ed4e3SBram Moolenaar      'try',
22022c5ed4e3SBram Moolenaar      '  echo "yes"',
22032c5ed4e3SBram Moolenaar      'catch /pat/# comment',
22042c5ed4e3SBram Moolenaar      'endtry',
22052c5ed4e3SBram Moolenaar      ], 'E488:')
22067a092245SBram Moolenaar  CheckDefFailure([
22077a092245SBram Moolenaar      'try',
22087a092245SBram Moolenaar      'echo "yes"',
22097a092245SBram Moolenaar      'catch',
22107a092245SBram Moolenaar      'endtry# comment',
22117a092245SBram Moolenaar      ], 'E488:')
22122c5ed4e3SBram Moolenaar  CheckScriptFailure([
22132c5ed4e3SBram Moolenaar      'vim9script',
22142c5ed4e3SBram Moolenaar      'try',
22152c5ed4e3SBram Moolenaar      '  echo "yes"',
22162c5ed4e3SBram Moolenaar      'catch',
22172c5ed4e3SBram Moolenaar      'endtry# comment',
22189b7bf9e9SBram Moolenaar      ], 'E488:')
22192c5ed4e3SBram Moolenaar
22202c5ed4e3SBram Moolenaar  CheckScriptSuccess([
22212c5ed4e3SBram Moolenaar      'vim9script',
22222c5ed4e3SBram Moolenaar      'hi # comment',
22232c5ed4e3SBram Moolenaar      ])
22242c5ed4e3SBram Moolenaar  CheckScriptFailure([
22252c5ed4e3SBram Moolenaar      'vim9script',
22262c5ed4e3SBram Moolenaar      'hi# comment',
22272c5ed4e3SBram Moolenaar      ], 'E416:')
22281966c248SBram Moolenaar  CheckScriptSuccess([
22291966c248SBram Moolenaar      'vim9script',
22301966c248SBram Moolenaar      'hi Search # comment',
22311966c248SBram Moolenaar      ])
22321966c248SBram Moolenaar  CheckScriptFailure([
22331966c248SBram Moolenaar      'vim9script',
22341966c248SBram Moolenaar      'hi Search# comment',
22351966c248SBram Moolenaar      ], 'E416:')
22361966c248SBram Moolenaar  CheckScriptSuccess([
22371966c248SBram Moolenaar      'vim9script',
22381966c248SBram Moolenaar      'hi link This Search # comment',
22391966c248SBram Moolenaar      ])
22401966c248SBram Moolenaar  CheckScriptFailure([
22411966c248SBram Moolenaar      'vim9script',
22421966c248SBram Moolenaar      'hi link This That# comment',
22431966c248SBram Moolenaar      ], 'E413:')
22441966c248SBram Moolenaar  CheckScriptSuccess([
22451966c248SBram Moolenaar      'vim9script',
22461966c248SBram Moolenaar      'hi clear This # comment',
22471966c248SBram Moolenaar      'hi clear # comment',
22481966c248SBram Moolenaar      ])
2249f5be8cdbSBram Moolenaar  # not tested, because it doesn't give an error but a warning:
2250f5be8cdbSBram Moolenaar  # hi clear This# comment',
22511966c248SBram Moolenaar  CheckScriptFailure([
22521966c248SBram Moolenaar      'vim9script',
22531966c248SBram Moolenaar      'hi clear# comment',
22541966c248SBram Moolenaar      ], 'E416:')
22551966c248SBram Moolenaar
22561966c248SBram Moolenaar  CheckScriptSuccess([
22571966c248SBram Moolenaar      'vim9script',
22581966c248SBram Moolenaar      'hi Group term=bold',
22591966c248SBram Moolenaar      'match Group /todo/ # comment',
22601966c248SBram Moolenaar      ])
22611966c248SBram Moolenaar  CheckScriptFailure([
22621966c248SBram Moolenaar      'vim9script',
22631966c248SBram Moolenaar      'hi Group term=bold',
22641966c248SBram Moolenaar      'match Group /todo/# comment',
22651966c248SBram Moolenaar      ], 'E488:')
22661966c248SBram Moolenaar  CheckScriptSuccess([
22671966c248SBram Moolenaar      'vim9script',
22681966c248SBram Moolenaar      'match # comment',
22691966c248SBram Moolenaar      ])
22701966c248SBram Moolenaar  CheckScriptFailure([
22711966c248SBram Moolenaar      'vim9script',
22721966c248SBram Moolenaar      'match# comment',
22731966c248SBram Moolenaar      ], 'E475:')
22741966c248SBram Moolenaar  CheckScriptSuccess([
22751966c248SBram Moolenaar      'vim9script',
22761966c248SBram Moolenaar      'match none # comment',
22771966c248SBram Moolenaar      ])
22781966c248SBram Moolenaar  CheckScriptFailure([
22791966c248SBram Moolenaar      'vim9script',
22801966c248SBram Moolenaar      'match none# comment',
22811966c248SBram Moolenaar      ], 'E475:')
22821966c248SBram Moolenaar
22831966c248SBram Moolenaar  CheckScriptSuccess([
22841966c248SBram Moolenaar      'vim9script',
22851966c248SBram Moolenaar      'menutrans clear # comment',
22861966c248SBram Moolenaar      ])
22871966c248SBram Moolenaar  CheckScriptFailure([
22881966c248SBram Moolenaar      'vim9script',
22891966c248SBram Moolenaar      'menutrans clear# comment text',
22901966c248SBram Moolenaar      ], 'E474:')
22911966c248SBram Moolenaar
22921966c248SBram Moolenaar  CheckScriptSuccess([
22931966c248SBram Moolenaar      'vim9script',
22941966c248SBram Moolenaar      'syntax clear # comment',
22951966c248SBram Moolenaar      ])
22961966c248SBram Moolenaar  CheckScriptFailure([
22971966c248SBram Moolenaar      'vim9script',
22981966c248SBram Moolenaar      'syntax clear# comment text',
22991966c248SBram Moolenaar      ], 'E28:')
23001966c248SBram Moolenaar  CheckScriptSuccess([
23011966c248SBram Moolenaar      'vim9script',
23021966c248SBram Moolenaar      'syntax keyword Word some',
23031966c248SBram Moolenaar      'syntax clear Word # comment',
23041966c248SBram Moolenaar      ])
23051966c248SBram Moolenaar  CheckScriptFailure([
23061966c248SBram Moolenaar      'vim9script',
23071966c248SBram Moolenaar      'syntax keyword Word some',
23081966c248SBram Moolenaar      'syntax clear Word# comment text',
23091966c248SBram Moolenaar      ], 'E28:')
23101966c248SBram Moolenaar
23111966c248SBram Moolenaar  CheckScriptSuccess([
23121966c248SBram Moolenaar      'vim9script',
23131966c248SBram Moolenaar      'syntax list # comment',
23141966c248SBram Moolenaar      ])
23151966c248SBram Moolenaar  CheckScriptFailure([
23161966c248SBram Moolenaar      'vim9script',
23171966c248SBram Moolenaar      'syntax list# comment text',
23181966c248SBram Moolenaar      ], 'E28:')
23191966c248SBram Moolenaar
23201966c248SBram Moolenaar  CheckScriptSuccess([
23211966c248SBram Moolenaar      'vim9script',
23221966c248SBram Moolenaar      'syntax match Word /pat/ oneline # comment',
23231966c248SBram Moolenaar      ])
23241966c248SBram Moolenaar  CheckScriptFailure([
23251966c248SBram Moolenaar      'vim9script',
23261966c248SBram Moolenaar      'syntax match Word /pat/ oneline# comment',
23271966c248SBram Moolenaar      ], 'E475:')
23281966c248SBram Moolenaar
23291966c248SBram Moolenaar  CheckScriptSuccess([
23301966c248SBram Moolenaar      'vim9script',
23311966c248SBram Moolenaar      'syntax keyword Word word # comm[ent',
23321966c248SBram Moolenaar      ])
23331966c248SBram Moolenaar  CheckScriptFailure([
23341966c248SBram Moolenaar      'vim9script',
23351966c248SBram Moolenaar      'syntax keyword Word word# comm[ent',
23361966c248SBram Moolenaar      ], 'E789:')
23371966c248SBram Moolenaar
23381966c248SBram Moolenaar  CheckScriptSuccess([
23391966c248SBram Moolenaar      'vim9script',
23401966c248SBram Moolenaar      'syntax match Word /pat/ # comment',
23411966c248SBram Moolenaar      ])
23421966c248SBram Moolenaar  CheckScriptFailure([
23431966c248SBram Moolenaar      'vim9script',
23441966c248SBram Moolenaar      'syntax match Word /pat/# comment',
23451966c248SBram Moolenaar      ], 'E402:')
23461966c248SBram Moolenaar
23471966c248SBram Moolenaar  CheckScriptSuccess([
23481966c248SBram Moolenaar      'vim9script',
23491966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something # comment',
23501966c248SBram Moolenaar      ])
23511966c248SBram Moolenaar  CheckScriptFailure([
23521966c248SBram Moolenaar      'vim9script',
23531966c248SBram Moolenaar      'syntax match Word /pat/ contains=Something# comment',
23541966c248SBram Moolenaar      ], 'E475:')
23551966c248SBram Moolenaar  CheckScriptFailure([
23561966c248SBram Moolenaar      'vim9script',
23571966c248SBram Moolenaar      'syntax match Word /pat/ contains= # comment',
23581966c248SBram Moolenaar      ], 'E406:')
23591966c248SBram Moolenaar  CheckScriptFailure([
23601966c248SBram Moolenaar      'vim9script',
23611966c248SBram Moolenaar      'syntax match Word /pat/ contains=# comment',
23621966c248SBram Moolenaar      ], 'E475:')
23631966c248SBram Moolenaar
23641966c248SBram Moolenaar  CheckScriptSuccess([
23651966c248SBram Moolenaar      'vim9script',
23661966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/ # comment',
23671966c248SBram Moolenaar      ])
23681966c248SBram Moolenaar  CheckScriptFailure([
23691966c248SBram Moolenaar      'vim9script',
23701966c248SBram Moolenaar      'syntax region Word start=/pat/ end=/pat/# comment',
2371d032f34aSBram Moolenaar      ], 'E402:')
23721966c248SBram Moolenaar
23731966c248SBram Moolenaar  CheckScriptSuccess([
23741966c248SBram Moolenaar      'vim9script',
23751966c248SBram Moolenaar      'syntax sync # comment',
23761966c248SBram Moolenaar      ])
23771966c248SBram Moolenaar  CheckScriptFailure([
23781966c248SBram Moolenaar      'vim9script',
23791966c248SBram Moolenaar      'syntax sync# comment',
23801966c248SBram Moolenaar      ], 'E404:')
23811966c248SBram Moolenaar  CheckScriptSuccess([
23821966c248SBram Moolenaar      'vim9script',
23831966c248SBram Moolenaar      'syntax sync ccomment # comment',
23841966c248SBram Moolenaar      ])
23851966c248SBram Moolenaar  CheckScriptFailure([
23861966c248SBram Moolenaar      'vim9script',
23871966c248SBram Moolenaar      'syntax sync ccomment# comment',
23881966c248SBram Moolenaar      ], 'E404:')
23891966c248SBram Moolenaar
23901966c248SBram Moolenaar  CheckScriptSuccess([
23911966c248SBram Moolenaar      'vim9script',
23921966c248SBram Moolenaar      'syntax cluster Some contains=Word # comment',
23931966c248SBram Moolenaar      ])
23941966c248SBram Moolenaar  CheckScriptFailure([
23951966c248SBram Moolenaar      'vim9script',
23961966c248SBram Moolenaar      'syntax cluster Some contains=Word# comment',
23971966c248SBram Moolenaar      ], 'E475:')
2398a72cfb80SBram Moolenaar
2399a72cfb80SBram Moolenaar  CheckScriptSuccess([
2400a72cfb80SBram Moolenaar      'vim9script',
2401a72cfb80SBram Moolenaar      'command Echo echo # comment',
2402a72cfb80SBram Moolenaar      'command Echo # comment',
2403a72cfb80SBram Moolenaar      ])
2404a72cfb80SBram Moolenaar  CheckScriptFailure([
2405a72cfb80SBram Moolenaar      'vim9script',
2406a72cfb80SBram Moolenaar      'command Echo echo# comment',
2407a72cfb80SBram Moolenaar      'Echo',
2408a72cfb80SBram Moolenaar      ], 'E121:')
2409a72cfb80SBram Moolenaar  CheckScriptFailure([
2410a72cfb80SBram Moolenaar      'vim9script',
2411a72cfb80SBram Moolenaar      'command Echo# comment',
2412a72cfb80SBram Moolenaar      ], 'E182:')
2413a72cfb80SBram Moolenaar  CheckScriptFailure([
2414a72cfb80SBram Moolenaar      'vim9script',
2415a72cfb80SBram Moolenaar      'command Echo echo',
2416a72cfb80SBram Moolenaar      'command Echo# comment',
2417a72cfb80SBram Moolenaar      ], 'E182:')
2418a72cfb80SBram Moolenaar
2419a72cfb80SBram Moolenaar  CheckScriptSuccess([
2420a72cfb80SBram Moolenaar      'vim9script',
2421a72cfb80SBram Moolenaar      'function # comment',
2422a72cfb80SBram Moolenaar      ])
2423a72cfb80SBram Moolenaar  CheckScriptFailure([
2424a72cfb80SBram Moolenaar      'vim9script',
24259898107fSBram Moolenaar      'function " comment',
24269898107fSBram Moolenaar      ], 'E129:')
24279898107fSBram Moolenaar  CheckScriptFailure([
24289898107fSBram Moolenaar      'vim9script',
2429a72cfb80SBram Moolenaar      'function# comment',
2430a72cfb80SBram Moolenaar      ], 'E129:')
2431a72cfb80SBram Moolenaar  CheckScriptSuccess([
2432a72cfb80SBram Moolenaar      'vim9script',
2433a72cfb80SBram Moolenaar      'function CheckScriptSuccess # comment',
2434a72cfb80SBram Moolenaar      ])
2435a72cfb80SBram Moolenaar  CheckScriptFailure([
2436a72cfb80SBram Moolenaar      'vim9script',
2437a72cfb80SBram Moolenaar      'function CheckScriptSuccess# comment',
2438a72cfb80SBram Moolenaar      ], 'E488:')
2439a72cfb80SBram Moolenaar
2440a72cfb80SBram Moolenaar  CheckScriptSuccess([
2441a72cfb80SBram Moolenaar      'vim9script',
24424c17ad94SBram Moolenaar      'func g:DeleteMeA()',
2443a72cfb80SBram Moolenaar      'endfunc',
24444c17ad94SBram Moolenaar      'delfunction g:DeleteMeA # comment',
2445a72cfb80SBram Moolenaar      ])
2446a72cfb80SBram Moolenaar  CheckScriptFailure([
2447a72cfb80SBram Moolenaar      'vim9script',
24484c17ad94SBram Moolenaar      'func g:DeleteMeB()',
2449a72cfb80SBram Moolenaar      'endfunc',
24504c17ad94SBram Moolenaar      'delfunction g:DeleteMeB# comment',
2451a72cfb80SBram Moolenaar      ], 'E488:')
2452a72cfb80SBram Moolenaar
2453a72cfb80SBram Moolenaar  CheckScriptSuccess([
2454a72cfb80SBram Moolenaar      'vim9script',
2455a72cfb80SBram Moolenaar      'call execute("ls") # comment',
2456a72cfb80SBram Moolenaar      ])
2457a72cfb80SBram Moolenaar  CheckScriptFailure([
2458a72cfb80SBram Moolenaar      'vim9script',
2459a72cfb80SBram Moolenaar      'call execute("ls")# comment',
2460a72cfb80SBram Moolenaar      ], 'E488:')
2461e7e4838fSBram Moolenaar
2462e7e4838fSBram Moolenaar  CheckScriptFailure([
2463e7e4838fSBram Moolenaar      'def Test() " comment',
2464e7e4838fSBram Moolenaar      'enddef',
2465e7e4838fSBram Moolenaar      ], 'E488:')
2466e7e4838fSBram Moolenaar  CheckScriptFailure([
2467e7e4838fSBram Moolenaar      'vim9script',
2468e7e4838fSBram Moolenaar      'def Test() " comment',
2469e7e4838fSBram Moolenaar      'enddef',
2470e7e4838fSBram Moolenaar      ], 'E488:')
2471e7e4838fSBram Moolenaar
2472e7e4838fSBram Moolenaar  CheckScriptSuccess([
2473e7e4838fSBram Moolenaar      'func Test() " comment',
2474e7e4838fSBram Moolenaar      'endfunc',
2475e7e4838fSBram Moolenaar      ])
24769898107fSBram Moolenaar  CheckScriptSuccess([
2477e7e4838fSBram Moolenaar      'vim9script',
2478e7e4838fSBram Moolenaar      'func Test() " comment',
2479e7e4838fSBram Moolenaar      'endfunc',
24809898107fSBram Moolenaar      ])
2481e7e4838fSBram Moolenaar
2482e7e4838fSBram Moolenaar  CheckScriptSuccess([
2483e7e4838fSBram Moolenaar      'def Test() # comment',
2484e7e4838fSBram Moolenaar      'enddef',
2485e7e4838fSBram Moolenaar      ])
2486e7e4838fSBram Moolenaar  CheckScriptFailure([
2487e7e4838fSBram Moolenaar      'func Test() # comment',
2488e7e4838fSBram Moolenaar      'endfunc',
2489e7e4838fSBram Moolenaar      ], 'E488:')
24902c5ed4e3SBram Moolenaarenddef
24912c5ed4e3SBram Moolenaar
24922c5ed4e3SBram Moolenaardef Test_vim9_comment_gui()
24932c5ed4e3SBram Moolenaar  CheckCanRunGui
24942c5ed4e3SBram Moolenaar
24952c5ed4e3SBram Moolenaar  CheckScriptFailure([
24962c5ed4e3SBram Moolenaar      'vim9script',
24972c5ed4e3SBram Moolenaar      'gui#comment'
24982c5ed4e3SBram Moolenaar      ], 'E499:')
24992c5ed4e3SBram Moolenaar  CheckScriptFailure([
25002c5ed4e3SBram Moolenaar      'vim9script',
25012c5ed4e3SBram Moolenaar      'gui -f#comment'
25022c5ed4e3SBram Moolenaar      ], 'E499:')
25037a092245SBram Moolenaarenddef
25047a092245SBram Moolenaar
2505a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled()
25066797966dSBram Moolenaar  au TabEnter *.vim g:entered = 1
25076797966dSBram Moolenaar  au TabEnter *.x g:entered = 2
2508a26b9700SBram Moolenaar
2509a26b9700SBram Moolenaar  edit test.vim
2510a26b9700SBram Moolenaar  doautocmd TabEnter #comment
2511a26b9700SBram Moolenaar  assert_equal(1, g:entered)
2512a26b9700SBram Moolenaar
2513a26b9700SBram Moolenaar  doautocmd TabEnter f.x
2514a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2515a26b9700SBram Moolenaar
2516a26b9700SBram Moolenaar  g:entered = 0
2517a26b9700SBram Moolenaar  doautocmd TabEnter f.x #comment
2518a26b9700SBram Moolenaar  assert_equal(2, g:entered)
2519a26b9700SBram Moolenaar
2520a26b9700SBram Moolenaar  assert_fails('doautocmd Syntax#comment', 'E216:')
2521a26b9700SBram Moolenaar
2522a26b9700SBram Moolenaar  au! TabEnter
2523a26b9700SBram Moolenaar  unlet g:entered
2524d72c1bf0SBram Moolenaar
2525d72c1bf0SBram Moolenaar  CheckScriptSuccess([
2526d72c1bf0SBram Moolenaar      'vim9script',
25276797966dSBram Moolenaar      'g:var = 123',
2528e55b1c09SBram Moolenaar      'b:var = 456',
2529e55b1c09SBram Moolenaar      'w:var = 777',
2530e55b1c09SBram Moolenaar      't:var = 888',
2531d72c1bf0SBram Moolenaar      'unlet g:var w:var # something',
2532d72c1bf0SBram Moolenaar      ])
2533d72c1bf0SBram Moolenaar
2534d72c1bf0SBram Moolenaar  CheckScriptFailure([
2535d72c1bf0SBram Moolenaar      'vim9script',
2536d72c1bf0SBram Moolenaar      'let g:var = 123',
2537e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a global variable:')
2538e55b1c09SBram Moolenaar
2539e55b1c09SBram Moolenaar  CheckScriptFailure([
2540e55b1c09SBram Moolenaar      'vim9script',
2541e55b1c09SBram Moolenaar      'let b:var = 123',
2542e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a buffer variable:')
2543e55b1c09SBram Moolenaar
2544e55b1c09SBram Moolenaar  CheckScriptFailure([
2545e55b1c09SBram Moolenaar      'vim9script',
2546e55b1c09SBram Moolenaar      'let w:var = 123',
2547e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a window variable:')
2548e55b1c09SBram Moolenaar
2549e55b1c09SBram Moolenaar  CheckScriptFailure([
2550e55b1c09SBram Moolenaar      'vim9script',
2551e55b1c09SBram Moolenaar      'let t:var = 123',
2552e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a tab variable:')
2553e55b1c09SBram Moolenaar
2554e55b1c09SBram Moolenaar  CheckScriptFailure([
2555e55b1c09SBram Moolenaar      'vim9script',
2556e55b1c09SBram Moolenaar      'let v:version = 123',
2557e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare a v: variable:')
2558e55b1c09SBram Moolenaar
2559e55b1c09SBram Moolenaar  CheckScriptFailure([
2560e55b1c09SBram Moolenaar      'vim9script',
2561e55b1c09SBram Moolenaar      'let $VARIABLE = "text"',
2562e55b1c09SBram Moolenaar      ], 'E1016: Cannot declare an environment variable:')
25636797966dSBram Moolenaar
25646797966dSBram Moolenaar  CheckScriptFailure([
25656797966dSBram Moolenaar      'vim9script',
25666797966dSBram Moolenaar      'g:var = 123',
256732e35117SBram Moolenaar      'unlet g:var# comment1',
2568d72c1bf0SBram Moolenaar      ], 'E108:')
2569d72c1bf0SBram Moolenaar
2570d72c1bf0SBram Moolenaar  CheckScriptFailure([
2571d72c1bf0SBram Moolenaar      'let g:var = 123',
2572d72c1bf0SBram Moolenaar      'unlet g:var # something',
2573d72c1bf0SBram Moolenaar      ], 'E488:')
2574faac4104SBram Moolenaar
2575faac4104SBram Moolenaar  CheckScriptSuccess([
2576faac4104SBram Moolenaar      'vim9script',
257732e35117SBram Moolenaar      'if 1 # comment2',
2578faac4104SBram Moolenaar      '  echo "yes"',
2579faac4104SBram Moolenaar      'elseif 2 #comment',
2580faac4104SBram Moolenaar      '  echo "no"',
2581faac4104SBram Moolenaar      'endif',
2582faac4104SBram Moolenaar      ])
2583faac4104SBram Moolenaar
2584faac4104SBram Moolenaar  CheckScriptFailure([
2585faac4104SBram Moolenaar      'vim9script',
258632e35117SBram Moolenaar      'if 1# comment3',
2587faac4104SBram Moolenaar      '  echo "yes"',
2588faac4104SBram Moolenaar      'endif',
2589faac4104SBram Moolenaar      ], 'E15:')
2590faac4104SBram Moolenaar
2591faac4104SBram Moolenaar  CheckScriptFailure([
2592faac4104SBram Moolenaar      'vim9script',
259332e35117SBram Moolenaar      'if 0 # comment4',
2594faac4104SBram Moolenaar      '  echo "yes"',
2595faac4104SBram Moolenaar      'elseif 2#comment',
2596faac4104SBram Moolenaar      '  echo "no"',
2597faac4104SBram Moolenaar      'endif',
2598faac4104SBram Moolenaar      ], 'E15:')
2599faac4104SBram Moolenaar
2600faac4104SBram Moolenaar  CheckScriptSuccess([
2601faac4104SBram Moolenaar      'vim9script',
260232e35117SBram Moolenaar      'let v = 1 # comment5',
2603faac4104SBram Moolenaar      ])
2604faac4104SBram Moolenaar
2605faac4104SBram Moolenaar  CheckScriptFailure([
2606faac4104SBram Moolenaar      'vim9script',
260732e35117SBram Moolenaar      'let v = 1# comment6',
260832e35117SBram Moolenaar      ], 'E15:')
2609faac4104SBram Moolenaar
2610faac4104SBram Moolenaar  CheckScriptSuccess([
2611faac4104SBram Moolenaar      'vim9script',
2612faac4104SBram Moolenaar      'new'
2613faac4104SBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2614df069eecSBram Moolenaar      ':$',
2615faac4104SBram Moolenaar      'dsearch /pat/ #comment',
2616faac4104SBram Moolenaar      'bwipe!',
2617faac4104SBram Moolenaar      ])
2618faac4104SBram Moolenaar
2619f5be8cdbSBram Moolenaar  CheckScriptFailure([
2620f5be8cdbSBram Moolenaar      'vim9script',
2621f5be8cdbSBram Moolenaar      'new'
2622f5be8cdbSBram Moolenaar      'call setline(1, ["# define pat", "last"])',
2623f5be8cdbSBram Moolenaar      ':$',
2624f5be8cdbSBram Moolenaar      'dsearch /pat/#comment',
2625f5be8cdbSBram Moolenaar      'bwipe!',
2626f5be8cdbSBram Moolenaar      ], 'E488:')
2627f5be8cdbSBram Moolenaar
2628f5be8cdbSBram Moolenaar  CheckScriptFailure([
2629f5be8cdbSBram Moolenaar      'vim9script',
2630f5be8cdbSBram Moolenaar      'func! SomeFunc()',
2631f5be8cdbSBram Moolenaar      ], 'E477:')
2632a26b9700SBram Moolenaarenddef
2633a26b9700SBram Moolenaar
26347e5bd91dSBram Moolenaardef Test_finish()
26357e5bd91dSBram Moolenaar  let lines =<< trim END
26367e5bd91dSBram Moolenaar    vim9script
26376797966dSBram Moolenaar    g:res = 'one'
26387e5bd91dSBram Moolenaar    if v:false | finish | endif
26396797966dSBram Moolenaar    g:res = 'two'
26407e5bd91dSBram Moolenaar    finish
26416797966dSBram Moolenaar    g:res = 'three'
26427e5bd91dSBram Moolenaar  END
26437e5bd91dSBram Moolenaar  writefile(lines, 'Xfinished')
26447e5bd91dSBram Moolenaar  source Xfinished
26457e5bd91dSBram Moolenaar  assert_equal('two', g:res)
26467e5bd91dSBram Moolenaar
26477e5bd91dSBram Moolenaar  unlet g:res
26487e5bd91dSBram Moolenaar  delete('Xfinished')
26497e5bd91dSBram Moolenaarenddef
26507e5bd91dSBram Moolenaar
265132e35117SBram Moolenaardef Test_let_func_call()
265232e35117SBram Moolenaar  let lines =<< trim END
265332e35117SBram Moolenaar    vim9script
265432e35117SBram Moolenaar    func GetValue()
265532e35117SBram Moolenaar      if exists('g:count')
265632e35117SBram Moolenaar        let g:count += 1
265732e35117SBram Moolenaar      else
265832e35117SBram Moolenaar        let g:count = 1
265932e35117SBram Moolenaar      endif
266032e35117SBram Moolenaar      return 'this'
266132e35117SBram Moolenaar    endfunc
266232e35117SBram Moolenaar    let val: string = GetValue()
2663f5be8cdbSBram Moolenaar    # env var is always a string
2664df671b46SBram Moolenaar    let env = $TERM
266532e35117SBram Moolenaar  END
266632e35117SBram Moolenaar  writefile(lines, 'Xfinished')
266732e35117SBram Moolenaar  source Xfinished
2668f5be8cdbSBram Moolenaar  # GetValue() is not called during discovery phase
266932e35117SBram Moolenaar  assert_equal(1, g:count)
267032e35117SBram Moolenaar
267132e35117SBram Moolenaar  unlet g:count
267232e35117SBram Moolenaar  delete('Xfinished')
267332e35117SBram Moolenaarenddef
267432e35117SBram Moolenaar
267532e35117SBram Moolenaardef Test_let_missing_type()
267632e35117SBram Moolenaar  let lines =<< trim END
267732e35117SBram Moolenaar    vim9script
2678df671b46SBram Moolenaar    let var = g:unknown
2679227a69deSBram Moolenaar  END
2680822ba247SBram Moolenaar  CheckScriptFailure(lines, 'E121:')
2681227a69deSBram Moolenaar
2682227a69deSBram Moolenaar  lines =<< trim END
2683227a69deSBram Moolenaar    vim9script
2684227a69deSBram Moolenaar    let nr: number = 123
2685227a69deSBram Moolenaar    let var = nr
2686227a69deSBram Moolenaar  END
2687822ba247SBram Moolenaar  CheckScriptSuccess(lines)
268832e35117SBram Moolenaarenddef
268932e35117SBram Moolenaar
2690c82a5b5dSBram Moolenaardef Test_let_declaration()
2691c82a5b5dSBram Moolenaar  let lines =<< trim END
2692c82a5b5dSBram Moolenaar    vim9script
2693c82a5b5dSBram Moolenaar    let var: string
2694c82a5b5dSBram Moolenaar    g:var_uninit = var
2695c82a5b5dSBram Moolenaar    var = 'text'
2696c82a5b5dSBram Moolenaar    g:var_test = var
2697f5be8cdbSBram Moolenaar    # prefixing s: is optional
2698984dddbeSBram Moolenaar    s:var = 'prefixed'
2699984dddbeSBram Moolenaar    g:var_prefixed = s:var
2700984dddbeSBram Moolenaar
2701984dddbeSBram Moolenaar    let s:other: number
2702984dddbeSBram Moolenaar    other = 1234
2703984dddbeSBram Moolenaar    g:other_var = other
2704c82a5b5dSBram Moolenaar  END
2705c82a5b5dSBram Moolenaar  CheckScriptSuccess(lines)
2706c82a5b5dSBram Moolenaar  assert_equal('', g:var_uninit)
2707c82a5b5dSBram Moolenaar  assert_equal('text', g:var_test)
2708984dddbeSBram Moolenaar  assert_equal('prefixed', g:var_prefixed)
2709984dddbeSBram Moolenaar  assert_equal(1234, g:other_var)
2710c82a5b5dSBram Moolenaar
2711c82a5b5dSBram Moolenaar  unlet g:var_uninit
2712c82a5b5dSBram Moolenaar  unlet g:var_test
2713984dddbeSBram Moolenaar  unlet g:var_prefixed
2714984dddbeSBram Moolenaar  unlet g:other_var
2715c82a5b5dSBram Moolenaarenddef
2716c82a5b5dSBram Moolenaar
2717c5b1c20bSBram Moolenaardef Test_let_declaration_fails()
2718c5b1c20bSBram Moolenaar  let lines =<< trim END
2719c5b1c20bSBram Moolenaar    vim9script
2720c5b1c20bSBram Moolenaar    const var: string
2721c5b1c20bSBram Moolenaar  END
2722c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1021:')
2723c5b1c20bSBram Moolenaar
2724c5b1c20bSBram Moolenaar  lines =<< trim END
2725c5b1c20bSBram Moolenaar    vim9script
2726c5b1c20bSBram Moolenaar    let 9var: string
2727c5b1c20bSBram Moolenaar  END
2728c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E475:')
2729c5b1c20bSBram Moolenaarenddef
2730c5b1c20bSBram Moolenaar
273134db91f7SBram Moolenaardef Test_let_type_check()
273234db91f7SBram Moolenaar  let lines =<< trim END
273334db91f7SBram Moolenaar    vim9script
273434db91f7SBram Moolenaar    let var: string
273534db91f7SBram Moolenaar    var = 1234
273634db91f7SBram Moolenaar  END
273734db91f7SBram Moolenaar  CheckScriptFailure(lines, 'E1013:')
2738984dddbeSBram Moolenaar
2739984dddbeSBram Moolenaar  lines =<< trim END
2740984dddbeSBram Moolenaar    vim9script
2741984dddbeSBram Moolenaar    let var:string
2742984dddbeSBram Moolenaar  END
2743984dddbeSBram Moolenaar  CheckScriptFailure(lines, 'E1069:')
2744c5b1c20bSBram Moolenaar
2745c5b1c20bSBram Moolenaar  lines =<< trim END
2746c5b1c20bSBram Moolenaar    vim9script
2747c5b1c20bSBram Moolenaar    let var: asdf
2748c5b1c20bSBram Moolenaar  END
2749c5b1c20bSBram Moolenaar  CheckScriptFailure(lines, 'E1010:')
275034db91f7SBram Moolenaarenddef
275134db91f7SBram Moolenaar
2752a5d0077eSBram Moolenaardef Test_forward_declaration()
2753a5d0077eSBram Moolenaar  let lines =<< trim END
2754a5d0077eSBram Moolenaar    vim9script
2755a5d0077eSBram Moolenaar    def GetValue(): string
2756a5d0077eSBram Moolenaar      return theVal
2757a5d0077eSBram Moolenaar    enddef
2758a5d0077eSBram Moolenaar    let theVal = 'something'
2759822ba247SBram Moolenaar    g:initVal = GetValue()
2760a5d0077eSBram Moolenaar    theVal = 'else'
2761a5d0077eSBram Moolenaar    g:laterVal = GetValue()
2762a5d0077eSBram Moolenaar  END
2763a5d0077eSBram Moolenaar  writefile(lines, 'Xforward')
2764a5d0077eSBram Moolenaar  source Xforward
2765a5d0077eSBram Moolenaar  assert_equal('something', g:initVal)
2766a5d0077eSBram Moolenaar  assert_equal('else', g:laterVal)
2767a5d0077eSBram Moolenaar
2768a5d0077eSBram Moolenaar  unlet g:initVal
2769a5d0077eSBram Moolenaar  unlet g:laterVal
2770a5d0077eSBram Moolenaar  delete('Xforward')
2771a5d0077eSBram Moolenaarenddef
2772a5d0077eSBram Moolenaar
27739721fb4eSBram Moolenaardef Test_source_vim9_from_legacy()
27749721fb4eSBram Moolenaar  let legacy_lines =<< trim END
27759721fb4eSBram Moolenaar    source Xvim9_script.vim
27769721fb4eSBram Moolenaar
27779721fb4eSBram Moolenaar    call assert_false(exists('local'))
27789721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27799721fb4eSBram Moolenaar    call assert_false(exists('s:exported'))
27809721fb4eSBram Moolenaar    call assert_equal('global', global)
27819721fb4eSBram Moolenaar    call assert_equal('global', g:global)
27829721fb4eSBram Moolenaar
27839721fb4eSBram Moolenaar    " imported variable becomes script-local
27849721fb4eSBram Moolenaar    import exported from './Xvim9_script.vim'
27859721fb4eSBram Moolenaar    call assert_equal('exported', s:exported)
27869721fb4eSBram Moolenaar    call assert_false(exists('exported'))
27879721fb4eSBram Moolenaar
27889721fb4eSBram Moolenaar    " imported function becomes script-local
27899721fb4eSBram Moolenaar    import GetText from './Xvim9_script.vim'
27909721fb4eSBram Moolenaar    call assert_equal('text', s:GetText())
27919721fb4eSBram Moolenaar    call assert_false(exists('*GetText'))
27929721fb4eSBram Moolenaar  END
27939721fb4eSBram Moolenaar  writefile(legacy_lines, 'Xlegacy_script.vim')
27949721fb4eSBram Moolenaar
27959721fb4eSBram Moolenaar  let vim9_lines =<< trim END
27969721fb4eSBram Moolenaar    vim9script
27979721fb4eSBram Moolenaar    let local = 'local'
27989721fb4eSBram Moolenaar    g:global = 'global'
27999721fb4eSBram Moolenaar    export let exported = 'exported'
28009721fb4eSBram Moolenaar    export def GetText(): string
28019721fb4eSBram Moolenaar       return 'text'
28029721fb4eSBram Moolenaar    enddef
28039721fb4eSBram Moolenaar  END
28049721fb4eSBram Moolenaar  writefile(vim9_lines, 'Xvim9_script.vim')
28059721fb4eSBram Moolenaar
28069721fb4eSBram Moolenaar  source Xlegacy_script.vim
28079721fb4eSBram Moolenaar
28089721fb4eSBram Moolenaar  assert_equal('global', g:global)
2809f5be8cdbSBram Moolenaar  unlet g:global
28109721fb4eSBram Moolenaar
28119721fb4eSBram Moolenaar  delete('Xlegacy_script.vim')
28129721fb4eSBram Moolenaar  delete('Xvim9_script.vim')
28139721fb4eSBram Moolenaarenddef
2814a5d0077eSBram Moolenaar
2815eeb27bfeSBram Moolenaardef Test_vim9_copen()
2816eeb27bfeSBram Moolenaar  # this was giving an error for setting w:quickfix_title
2817eeb27bfeSBram Moolenaar  copen
2818eeb27bfeSBram Moolenaar  quit
2819eeb27bfeSBram Moolenaarenddef
2820eeb27bfeSBram Moolenaar
28212d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd
28222d6b20d6SBram Moolenaardef Test_vim9_autoload()
28232d6b20d6SBram Moolenaar  let lines =<< trim END
28242d6b20d6SBram Moolenaar     vim9script
28252d6b20d6SBram Moolenaar     def foo#test()
28262d6b20d6SBram Moolenaar         echomsg getreg('"')
28272d6b20d6SBram Moolenaar     enddef
28282d6b20d6SBram Moolenaar  END
28292d6b20d6SBram Moolenaar
28302d6b20d6SBram Moolenaar  mkdir('Xdir/autoload', 'p')
28312d6b20d6SBram Moolenaar  writefile(lines, 'Xdir/autoload/foo.vim')
28322d6b20d6SBram Moolenaar  let save_rtp = &rtp
28332d6b20d6SBram Moolenaar  exe 'set rtp^=' .. getcwd() .. '/Xdir'
28342d6b20d6SBram Moolenaar  augroup test
28352d6b20d6SBram Moolenaar    autocmd TextYankPost * call foo#test()
28362d6b20d6SBram Moolenaar  augroup END
28372d6b20d6SBram Moolenaar
28382d6b20d6SBram Moolenaar  normal Y
28392d6b20d6SBram Moolenaar
28402d6b20d6SBram Moolenaar  augroup test
28412d6b20d6SBram Moolenaar    autocmd!
28422d6b20d6SBram Moolenaar  augroup END
28432d6b20d6SBram Moolenaar  delete('Xdir', 'rf')
28442d6b20d6SBram Moolenaar  &rtp = save_rtp
28452d6b20d6SBram Moolenaarenddef
28462d6b20d6SBram Moolenaar
2847585fea7bSBram Moolenaar" Keep this last, it messes up highlighting.
2848585fea7bSBram Moolenaardef Test_substitute_cmd()
2849585fea7bSBram Moolenaar  new
2850585fea7bSBram Moolenaar  setline(1, 'something')
2851585fea7bSBram Moolenaar  :substitute(some(other(
2852585fea7bSBram Moolenaar  assert_equal('otherthing', getline(1))
2853585fea7bSBram Moolenaar  bwipe!
2854585fea7bSBram Moolenaar
2855f5be8cdbSBram Moolenaar  # also when the context is Vim9 script
2856585fea7bSBram Moolenaar  let lines =<< trim END
2857585fea7bSBram Moolenaar    vim9script
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  END
2864585fea7bSBram Moolenaar  writefile(lines, 'Xvim9lines')
2865585fea7bSBram Moolenaar  source Xvim9lines
2866585fea7bSBram Moolenaar
2867585fea7bSBram Moolenaar  delete('Xvim9lines')
2868585fea7bSBram Moolenaarenddef
2869585fea7bSBram Moolenaar
28708a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
2871