blob: b7902f10c0ccd720e8abf19ecdb55ad8c894ebfd [file] [log] [blame]
Bram Moolenaard8448622022-01-07 21:39:52 +00001" Test import/export of the Vim9 script language.
Bram Moolenaar160aa862022-01-10 21:29:57 +00002" Also the autoload mechanism.
Bram Moolenaard8448622022-01-07 21:39:52 +00003
4source check.vim
5source term_util.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00006import './vim9.vim' as v9
Bram Moolenaard8448622022-01-07 21:39:52 +00007
8let s:export_script_lines =<< trim END
9 vim9script
10 var name: string = 'bob'
11 def Concat(arg: string): string
12 return name .. arg
13 enddef
14 g:result = Concat('bie')
15 g:localname = name
16
17 export const CONST = 1234
18 export var exported = 9876
19 export var exp_name = 'John'
20 export def Exported(): string
21 return 'Exported'
22 enddef
23 export def ExportedValue(): number
24 return exported
25 enddef
26 export def ExportedInc()
27 exported += 5
28 enddef
29 export final theList = [1]
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000030 export def AddSome(s: string): string
31 return s .. 'some'
32 enddef
33 export var AddRef = AddSome
Bram Moolenaard8448622022-01-07 21:39:52 +000034END
35
Bram Moolenaar62aec932022-01-29 21:45:34 +000036def s:Undo_export_script_lines()
Bram Moolenaard8448622022-01-07 21:39:52 +000037 unlet g:result
38 unlet g:localname
39enddef
40
41def Test_vim9_import_export()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +010042 writefile(s:export_script_lines, 'Xexport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +000043 var import_script_lines =<< trim END
44 vim9script
45 var dir = './'
46 var ext = ".vim"
47 import dir .. 'Xexport' .. ext as expo
48
49 g:exported1 = expo.exported
50 expo.exported += 3
51 g:exported2 = expo.exported
52 g:exported3 = expo.ExportedValue()
53
54 expo.ExportedInc()
55 g:exported_i1 = expo.exported
56 g:exported_i2 = expo.ExportedValue()
57
58 expo.exported = 11
59 g:exported_s1 = expo.exported
60 g:exported_s2 = expo.ExportedValue()
61
62 g:imported_func = expo.Exported()
63
64 def GetExported(): string
65 var local_dict = {ref: expo.Exported}
66 return local_dict.ref()
67 enddef
68 g:funcref_result = GetExported()
69
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +000070 def GetName(): string
71 return expo.exp_name .. 'son'
72 enddef
73 g:long_name = GetName()
74
Bram Moolenaard8448622022-01-07 21:39:52 +000075 g:imported_name = expo.exp_name
76 expo.exp_name ..= ' Doe'
Bram Moolenaar47036b62022-01-16 21:18:53 +000077 expo.exp_name = expo.exp_name .. ' Maar'
Bram Moolenaard8448622022-01-07 21:39:52 +000078 g:imported_name_appended = expo.exp_name
79 g:exported_later = expo.exported
80
81 expo.theList->add(2)
82 assert_equal([1, 2], expo.theList)
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000083
84 assert_equal('andthensome', 'andthen'->expo.AddSome())
85 assert_equal('awesome', 'awe'->expo.AddRef())
Bram Moolenaard8448622022-01-07 21:39:52 +000086 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +010087 writefile(import_script_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +000088 source Ximport.vim
89
90 assert_equal('bobbie', g:result)
91 assert_equal('bob', g:localname)
92 assert_equal(9876, g:exported1)
93 assert_equal(9879, g:exported2)
94 assert_equal(9879, g:exported3)
95
96 assert_equal(9884, g:exported_i1)
97 assert_equal(9884, g:exported_i2)
98
99 assert_equal(11, g:exported_s1)
100 assert_equal(11, g:exported_s2)
101 assert_equal(11, g:exported_later)
102
103 assert_equal('Exported', g:imported_func)
104 assert_equal('Exported', g:funcref_result)
105 assert_equal('John', g:imported_name)
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +0000106 assert_equal('Johnson', g:long_name)
Bram Moolenaar47036b62022-01-16 21:18:53 +0000107 assert_equal('John Doe Maar', g:imported_name_appended)
Bram Moolenaard8448622022-01-07 21:39:52 +0000108 assert_false(exists('g:name'))
109
110 Undo_export_script_lines()
111 unlet g:exported1
112 unlet g:exported2
113 unlet g:exported3
114 unlet g:exported_i1
115 unlet g:exported_i2
116 unlet g:exported_later
117 unlet g:imported_func
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +0000118 unlet g:imported_name g:long_name g:imported_name_appended
Bram Moolenaard8448622022-01-07 21:39:52 +0000119 delete('Ximport.vim')
120
121 # similar, with line breaks
122 var import_line_break_script_lines =<< trim END
123 vim9script
124 import './Xexport.vim'
125 as expo
126 g:exported = expo.exported
127 expo.exported += 7
128 g:exported_added = expo.exported
129 g:imported_func = expo.Exported()
130 END
131 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
132 source Ximport_lbr.vim
133
134 assert_equal(11, g:exported)
135 assert_equal(18, g:exported_added)
136 assert_equal('Exported', g:imported_func)
137
138 # exported script not sourced again
139 assert_false(exists('g:result'))
140 unlet g:exported
141 unlet g:exported_added
142 unlet g:imported_func
143 delete('Ximport_lbr.vim')
144
Bram Moolenaar68854a82022-01-31 18:59:13 +0000145 var import_shadows_cmdmod_lines =<< trim END
146 vim9script
147 import './Xexport.vim' as vim9
148 vim9.exp_name = 'Shadow'
149 assert_equal('Shadow', vim9.exp_name)
150 END
151 v9.CheckScriptSuccess(import_shadows_cmdmod_lines)
152
Bram Moolenaard8448622022-01-07 21:39:52 +0000153 var line_break_before_dot =<< trim END
154 vim9script
155 import './Xexport.vim' as expo
156 g:exported = expo
157 .exported
158 END
159 writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
160 assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
161 delete('Ximport_lbr_before_dot.vim')
162
163 var line_break_after_dot =<< trim END
164 vim9script
165 import './Xexport.vim' as expo
166 g:exported = expo.
167 exported
168 END
169 writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
170 assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
171 delete('Ximport_lbr_after_dot.vim')
172
173 var import_star_as_lines =<< trim END
174 vim9script
175 import './Xexport.vim' as Export
176 def UseExport()
177 g:exported_def = Export.exported
178 enddef
179 g:exported_script = Export.exported
180 assert_equal(1, exists('Export.exported'))
181 assert_equal(0, exists('Export.notexported'))
182 UseExport()
183 END
184 writefile(import_star_as_lines, 'Ximport.vim')
185 source Ximport.vim
186
187 assert_equal(18, g:exported_def)
188 assert_equal(18, g:exported_script)
189 unlet g:exported_def
190 unlet g:exported_script
191
192 var import_star_as_lines_no_dot =<< trim END
193 vim9script
194 import './Xexport.vim' as Export
195 def Func()
196 var dummy = 1
197 var imported = Export + dummy
198 enddef
199 defcompile
200 END
201 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
202 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
203
204 var import_star_as_lines_dot_space =<< trim END
205 vim9script
206 import './Xexport.vim' as Export
207 def Func()
208 var imported = Export . exported
209 enddef
210 defcompile
211 END
212 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
213 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
214
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000215 writefile(s:export_script_lines, 'Xexport2.vim')
216 var import_as_duplicated =<< trim END
Bram Moolenaard8448622022-01-07 21:39:52 +0000217 vim9script
218 import './Xexport.vim' as expo
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000219 import './Xexport2.vim' as expo
Bram Moolenaard8448622022-01-07 21:39:52 +0000220 END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000221 writefile(import_as_duplicated, 'Ximport.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000222 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000223 delete('Xexport2.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000224
225 var import_star_as_lines_script_no_dot =<< trim END
226 vim9script
227 import './Xexport.vim' as Export
228 g:imported_script = Export exported
229 END
230 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
231 assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
232
233 var import_star_as_lines_script_space_after_dot =<< trim END
234 vim9script
235 import './Xexport.vim' as Export
236 g:imported_script = Export. exported
237 END
238 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
239 assert_fails('source Ximport.vim', 'E1074:')
240
241 var import_star_as_lines_missing_name =<< trim END
242 vim9script
243 import './Xexport.vim' as Export
244 def Func()
245 var imported = Export.
246 enddef
247 defcompile
248 END
249 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
250 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
251
252 var import_star_as_lbr_lines =<< trim END
253 vim9script
254 import './Xexport.vim'
255 as Export
256 def UseExport()
257 g:exported = Export.exported
258 enddef
259 UseExport()
260 END
261 writefile(import_star_as_lbr_lines, 'Ximport.vim')
262 source Ximport.vim
263 assert_equal(18, g:exported)
264 unlet g:exported
265
266 # try to use something that exists but is not exported
267 var import_not_exported_lines =<< trim END
268 vim9script
269 import './Xexport.vim' as expo
270 echo expo.name
271 END
272 writefile(import_not_exported_lines, 'Ximport.vim')
273 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
274
275 # try to import something that is already defined
276 var import_already_defined =<< trim END
277 vim9script
278 var exported = 'something'
279 import './Xexport.vim' as exported
280 END
281 writefile(import_already_defined, 'Ximport.vim')
282 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
283
284 # try changing an imported const
285 var import_assign_to_const =<< trim END
286 vim9script
287 import './Xexport.vim' as expo
288 def Assign()
289 expo.CONST = 987
290 enddef
291 defcompile
292 END
293 writefile(import_assign_to_const, 'Ximport.vim')
294 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
295
296 # try changing an imported final
297 var import_assign_to_final =<< trim END
298 vim9script
299 import './Xexport.vim' as expo
300 def Assign()
301 expo.theList = [2]
302 enddef
303 defcompile
304 END
305 writefile(import_assign_to_final, 'Ximport.vim')
306 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
307
308 var import_no_as_lines =<< trim END
309 vim9script
310 import './Xexport.vim' name
311 END
312 writefile(import_no_as_lines, 'Ximport.vim')
313 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
314
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100315 # trailing starts with "as"
316 var import_bad_as_lines =<< trim END
317 vim9script
318 import './Xexport.vim' asname
319 END
320 writefile(import_no_as_lines, 'Ximport.vim')
321 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
322
Bram Moolenaard8448622022-01-07 21:39:52 +0000323 var import_invalid_string_lines =<< trim END
324 vim9script
325 import Xexport.vim
326 END
327 writefile(import_invalid_string_lines, 'Ximport.vim')
328 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
329
330 var import_wrong_name_lines =<< trim END
331 vim9script
332 import './XnoExport.vim'
333 END
334 writefile(import_wrong_name_lines, 'Ximport.vim')
335 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
336
337 var import_redefining_lines =<< trim END
338 vim9script
339 import './Xexport.vim' as exported
340 var exported = 5
341 END
342 writefile(import_redefining_lines, 'Ximport.vim')
343 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
344
Bram Moolenaar160aa862022-01-10 21:29:57 +0000345 var import_missing_dot_lines =<< trim END
346 vim9script
347 import './Xexport.vim' as expo
348 def Test()
349 expo = 9
350 enddef
351 defcompile
352 END
353 writefile(import_missing_dot_lines, 'Ximport.vim')
354 assert_fails('source Ximport.vim', 'E1258:', '', 1)
355
356 var import_missing_name_lines =<< trim END
357 vim9script
358 import './Xexport.vim' as expo
359 def Test()
360 expo.99 = 9
361 enddef
362 defcompile
363 END
364 writefile(import_missing_name_lines, 'Ximport.vim')
Bram Moolenaar76283822022-01-10 21:39:03 +0000365 assert_fails('source Ximport.vim', 'E1259:', '', 1)
Bram Moolenaar160aa862022-01-10 21:29:57 +0000366
Bram Moolenaard8448622022-01-07 21:39:52 +0000367 var import_assign_wrong_type_lines =<< trim END
368 vim9script
369 import './Xexport.vim' as expo
370 expo.exported = 'xxx'
371 END
372 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
373 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
374
375 var import_assign_const_lines =<< trim END
376 vim9script
377 import './Xexport.vim' as expo
378 expo.CONST = 4321
379 END
380 writefile(import_assign_const_lines, 'Ximport.vim')
381 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
382
Bram Moolenaard8448622022-01-07 21:39:52 +0000383 # Check that in a Vim9 script 'cpo' is set to the Vim default.
384 # Flags added or removed are also applied to the restored value.
385 set cpo=abcd
386 var lines =<< trim END
387 vim9script
388 g:cpo_in_vim9script = &cpo
389 set cpo+=f
390 set cpo-=c
391 g:cpo_after_vim9script = &cpo
392 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100393 writefile(lines, 'Xvim9_script', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000394 source Xvim9_script
395 assert_equal('fabd', &cpo)
396 set cpo&vim
397 assert_equal(&cpo, g:cpo_in_vim9script)
398 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
399 assert_equal(newcpo, g:cpo_after_vim9script)
400
401 delete('Xvim9_script')
402enddef
403
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100404def Test_import_very_long_name()
405 var lines =<< trim END
406 vim9script
407
408 export var verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname = 'asdf'
409 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100410 writefile(lines, 'Xverylong.vim', 'D')
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100411
412 lines =<< trim END
413 vim9script
414 import './Xverylong.vim'
415
416 g:result = Xverylong.verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname
417 END
418 v9.CheckScriptSuccess(lines)
419 assert_equal('asdf', g:result)
420
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100421 unlet g:result
422enddef
423
Bram Moolenaard8448622022-01-07 21:39:52 +0000424def Test_import_funcref()
425 var lines =<< trim END
426 vim9script
427 export def F(): number
428 return 42
429 enddef
430 export const G = F
431 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100432 writefile(lines, 'Xlib.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000433
434 lines =<< trim END
435 vim9script
436 import './Xlib.vim' as lib
437 const Foo = lib.G()
438 assert_equal(42, Foo)
439
440 def DoTest()
441 const Goo = lib.G()
442 assert_equal(42, Goo)
443 enddef
444 DoTest()
445 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000446 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000447enddef
448
Bram Moolenaar5ab30012022-10-07 17:26:22 +0100449def Test_export_closure()
450 # tests that the closure in block can be compiled, not the import part
451 var lines =<< trim END
452 vim9script
453 {
454 var foo = 42
455 export def Bar(): number
456 return foo
457 enddef
458 }
459 assert_equal(42, Bar())
460 END
461 v9.CheckScriptSuccess(lines)
462enddef
463
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000464def Test_import_duplicate_function()
465 # Function Hover() exists in both scripts, partial should refer to the right
466 # one.
467 var lines =<< trim END
468 vim9script
469
470 def Hover(d: dict<any>): string
471 return 'found it'
472 enddef
473
474 export def NewLspServer(): dict<any>
475 var d: dict<any> = {}
476 d->extend({hover: function('Hover', [d])})
477 return d
478 enddef
479
480 NewLspServer()
481 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100482 writefile(lines, 'Xserver.vim', 'D')
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000483
484 lines =<< trim END
485 vim9script
486
487 import './Xserver.vim' as server
488
489 export def Hover()
490 enddef
491
492 def AddServer()
493 var d: dict<any> = server.NewLspServer()
494 assert_equal('found it', d.hover())
495 enddef
496 AddServer()
497 END
498 v9.CheckScriptSuccess(lines)
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000499enddef
500
501
Bram Moolenaard8448622022-01-07 21:39:52 +0000502def Test_import_fails()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100503 writefile([], 'Xfoo.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000504 var lines =<< trim END
505 import './Xfoo.vim' as foo
506 foo = 'bar'
507 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000508 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
Bram Moolenaard8448622022-01-07 21:39:52 +0000509 lines =<< trim END
510 vim9script
511 import './Xfoo.vim' as foo
512 var that = foo
513 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000514 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000515 lines =<< trim END
516 vim9script
517 import './Xfoo.vim' as foo
518 var that: any
519 that += foo
520 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000521 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000522 lines =<< trim END
523 vim9script
524 import './Xfoo.vim' as foo
525 foo += 9
526 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000527 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaard8448622022-01-07 21:39:52 +0000528
529 lines =<< trim END
530 vim9script
531 import './Xfoo.vim' as 9foo
532 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000533 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000534 lines =<< trim END
535 vim9script
536 import './Xfoo.vim' as the#foo
537 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000538 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000539 lines =<< trim END
540 vim9script
541 import './Xfoo.vim' as g:foo
542 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000543 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000544
Bram Moolenaard8448622022-01-07 21:39:52 +0000545 lines =<< trim END
546 vim9script
547 def TheFunc()
548 echo 'the func'
549 enddef
550 export var Ref = TheFunc
551 END
552 writefile([], 'Xthat.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000553
Bram Moolenaard8448622022-01-07 21:39:52 +0000554 lines =<< trim END
555 import './Xthat.vim' as That
556 That()
557 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000558 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000559
560 lines =<< trim END
Bram Moolenaar937610b2022-01-19 17:21:29 +0000561 vim9script
562 import './Xthat.vim' as That
563 def Func()
564 echo That()
565 enddef
566 Func()
567 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000568 v9.CheckScriptFailure(lines, 'E1236: Cannot use That itself')
Bram Moolenaar937610b2022-01-19 17:21:29 +0000569
570 lines =<< trim END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000571 import './Xthat.vim' as one
572 import './Xthat.vim' as two
573 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000574 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000575
576 delete('Xthat.vim')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000577
578 lines =<< trim END
579 vim9script
580 export var item = 'hello'
581 import './Xyourself.vim'
582 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100583 writefile(lines, 'Xyourself.vim', 'D')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000584 assert_fails('source Xyourself.vim', 'E1088:')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000585
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100586 mkdir('Ximport', 'R')
Bram Moolenaard8448622022-01-07 21:39:52 +0000587
588 writefile(['vim9script'], 'Ximport/.vim')
589 lines =<< trim END
590 vim9script
591 import './Ximport/.vim'
592 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000593 v9.CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
Bram Moolenaard8448622022-01-07 21:39:52 +0000594 lines =<< trim END
595 vim9script
596 import './Ximport/.vim' as vim
597 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000598 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000599
600 writefile(['vim9script'], 'Ximport/.vimrc')
601 lines =<< trim END
602 vim9script
603 import './Ximport/.vimrc'
604 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000605 v9.CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000606 lines =<< trim END
607 vim9script
608 import './Ximport/.vimrc' as vimrc
609 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000610 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000611
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100612 new
613 setline(1, ['vim9script', 'import "" as abc'])
614 assert_fails('source', 'E1071: Invalid string for :import: "" as abc')
615 setline(2, 'import [] as abc')
616 assert_fails('source', 'E1071: Invalid string for :import: [] as abc')
617 setline(2, 'import test_null_string() as abc')
618 assert_fails('source', 'E1071: Invalid string for :import: test_null_string() as abc')
619 bw!
620 call writefile(['vim9script', "import './Xfoo.vim' ask expo"], 'Xbar.vim')
621 assert_fails('source Xbar.vim', 'E488: Trailing characters: ask expo')
622 writefile([], 'Xtemp')
623 call writefile(['vim9script', "import './Xtemp'"], 'Xbar.vim')
624 assert_fails('source Xbar.vim', 'E1257: Imported script must use "as" or end in .vim: Xtemp')
625 delete('Xtemp')
626 call writefile(['vim9script', "import './Xfoo.vim' as abc | foobar"], 'Xbar.vim')
627 assert_fails('source Xbar.vim', 'E492: Not an editor command: foobar')
628 call delete('Xbar.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000629enddef
630
631func g:Trigger()
632 source Ximport.vim
633 return "echo 'yes'\<CR>"
634endfunc
635
636def Test_import_export_expr_map()
637 # check that :import and :export work when buffer is locked
638 var export_lines =<< trim END
639 vim9script
640 export def That(): string
641 return 'yes'
642 enddef
643 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100644 writefile(export_lines, 'Xexport_that.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000645
646 var import_lines =<< trim END
647 vim9script
648 import './Xexport_that.vim' as that
649 assert_equal('yes', that.That())
650 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100651 writefile(import_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000652
653 nnoremap <expr> trigger g:Trigger()
654 feedkeys('trigger', "xt")
655
Bram Moolenaard8448622022-01-07 21:39:52 +0000656 nunmap trigger
657enddef
658
659def Test_import_in_filetype()
660 # check that :import works when the buffer is locked
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100661 mkdir('ftplugin', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +0000662 var export_lines =<< trim END
663 vim9script
664 export var That = 'yes'
665 END
666 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
667
668 var import_lines =<< trim END
669 vim9script
670 import './Xexport_ft.vim' as ft
671 assert_equal('yes', ft.That)
672 g:did_load_mytpe = 1
673 END
674 writefile(import_lines, 'ftplugin/qf.vim')
675
676 var save_rtp = &rtp
677 &rtp = getcwd() .. ',' .. &rtp
678
679 filetype plugin on
680 copen
681 assert_equal(1, g:did_load_mytpe)
682
683 quit!
Bram Moolenaard8448622022-01-07 21:39:52 +0000684 &rtp = save_rtp
685enddef
686
687def Test_use_import_in_mapping()
688 var lines =<< trim END
689 vim9script
Bram Moolenaar89445512022-04-14 12:58:23 +0100690 export def Funcx(nr: number)
691 g:result = nr
Bram Moolenaard8448622022-01-07 21:39:52 +0000692 enddef
693 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100694 writefile(lines, 'XsomeExport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000695 lines =<< trim END
696 vim9script
697 import './XsomeExport.vim' as some
698 var Funcy = some.Funcx
Bram Moolenaar89445512022-04-14 12:58:23 +0100699 nnoremap <F3> :call <sid>Funcy(42)<cr>
700 nnoremap <F4> :call <sid>some.Funcx(44)<cr>
Bram Moolenaard8448622022-01-07 21:39:52 +0000701 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100702 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000703
704 source Xmapscript.vim
705 feedkeys("\<F3>", "xt")
706 assert_equal(42, g:result)
Bram Moolenaar89445512022-04-14 12:58:23 +0100707 feedkeys("\<F4>", "xt")
708 assert_equal(44, g:result)
Bram Moolenaard8448622022-01-07 21:39:52 +0000709
710 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +0000711 nunmap <F3>
Bram Moolenaar89445512022-04-14 12:58:23 +0100712 nunmap <F4>
713enddef
714
Bram Moolenaar648dd882022-04-14 21:36:15 +0100715def Test_use_relative_autoload_import_in_mapping()
Bram Moolenaar89445512022-04-14 12:58:23 +0100716 var lines =<< trim END
717 vim9script
718 export def Func()
719 g:result = 42
720 enddef
721 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100722 writefile(lines, 'XrelautoloadExport.vim', 'D')
Bram Moolenaar89445512022-04-14 12:58:23 +0100723 lines =<< trim END
724 vim9script
Bram Moolenaar648dd882022-04-14 21:36:15 +0100725 import autoload './XrelautoloadExport.vim' as some
Bram Moolenaar89445512022-04-14 12:58:23 +0100726 nnoremap <F3> :call <SID>some.Func()<CR>
727 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100728 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaar89445512022-04-14 12:58:23 +0100729
730 source Xmapscript.vim
Bram Moolenaar648dd882022-04-14 21:36:15 +0100731 assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100732 var l = getscriptinfo()
733 assert_match('XrelautoloadExport.vim$', l[-1].name)
734 assert_true(l[-1].autoload)
Bram Moolenaar89445512022-04-14 12:58:23 +0100735 feedkeys("\<F3>", "xt")
736 assert_equal(42, g:result)
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100737 l = getscriptinfo({name: 'XrelautoloadExport'})
738 assert_true(len(l) == 1)
739 assert_match('XrelautoloadExport.vim$', l[0].name)
740 assert_false(l[0].autoload)
Yegappan Lakshmanan2f892d82022-08-28 18:52:10 +0100741 assert_equal(999999, l[0].version)
Bram Moolenaar89445512022-04-14 12:58:23 +0100742
743 unlet g:result
Bram Moolenaar89445512022-04-14 12:58:23 +0100744 nunmap <F3>
Bram Moolenaard8448622022-01-07 21:39:52 +0000745enddef
746
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100747def Test_autoload_import_var()
748 # variable name starts with "autoload"
749 var lines =<< trim END
750 vim9script
751 var autoloaded = "Xtest.vim"
752 import autoloaded
753 END
754 v9.CheckScriptFailure(lines, 'E1053: Could not import "Xtest.vim')
755enddef
756
Bram Moolenaar648dd882022-04-14 21:36:15 +0100757def Test_use_autoload_import_in_mapping()
758 var lines =<< trim END
759 vim9script
760 export def Func()
761 g:result = 49
762 enddef
763 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100764 mkdir('Ximpdir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100765 writefile(lines, 'Ximpdir/autoload/XautoloadExport.vim')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100766 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100767 exe 'set rtp^=' .. getcwd() .. '/Ximpdir'
Bram Moolenaar648dd882022-04-14 21:36:15 +0100768
769 lines =<< trim END
770 vim9script
771 import autoload 'XautoloadExport.vim' as some
772 nnoremap <F3> :call <SID>some.Func()<CR>
773 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100774 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100775
776 source Xmapscript.vim
777 assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
778 feedkeys("\<F3>", "xt")
779 assert_equal(49, g:result)
780
781 unlet g:result
Bram Moolenaar648dd882022-04-14 21:36:15 +0100782 nunmap <F3>
Bram Moolenaar648dd882022-04-14 21:36:15 +0100783 &rtp = save_rtp
784enddef
785
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000786def Test_use_import_in_command_completion()
Bram Moolenaar15d16352022-01-17 20:09:08 +0000787 var lines =<< trim END
788 vim9script
789 export def Complete(..._): list<string>
790 return ['abcd']
791 enddef
792 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100793 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar15d16352022-01-17 20:09:08 +0000794
795 lines =<< trim END
796 vim9script
797 import './Xscript.vim'
798
799 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
800 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
801 assert_equal('#Cmd abcd', @:)
802 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000803 v9.CheckScriptSuccess(lines)
Bram Moolenaar15d16352022-01-17 20:09:08 +0000804
805 delcommand Cmd
Bram Moolenaar15d16352022-01-17 20:09:08 +0000806enddef
807
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100808def Test_use_import_with_funcref_in_command_completion()
809 var lines =<< trim END
810 vim9script
811 export def Complete(..._): list<string>
812 return ['abcd']
813 enddef
814 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100815 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100816
817 lines =<< trim END
818 vim9script
819 import './Xscript.vim'
820
821 var Ref = Xscript.Complete
822 exe "command -nargs=1 -complete=customlist," .. expand('<SID>') .. "Ref Cmd echo 'ok'"
823 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
824 assert_equal('#Cmd abcd', @:)
825 END
826 v9.CheckScriptSuccess(lines)
827
828 delcommand Cmd
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100829enddef
830
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000831def Test_use_autoload_import_in_insert_completion()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100832 mkdir('Xinsdir/autoload', 'pR')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000833 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100834 exe 'set rtp^=' .. getcwd() .. '/Xinsdir'
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000835
836 var lines =<< trim END
837 vim9script
838 export def ThesaurusFunc(findbase: bool, _): any
839 if findbase
840 return 1
841 endif
842 return [
843 'check',
844 'experiment',
845 'test',
846 'verification'
847 ]
848 enddef
849 g:completion_loaded = 'yes'
850 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100851 writefile(lines, 'Xinsdir/autoload/completion.vim')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000852
853 new
854 lines =<< trim END
855 vim9script
856 g:completion_loaded = 'no'
857 import autoload 'completion.vim'
858 set thesaurusfunc=completion.ThesaurusFunc
859 assert_equal('no', g:completion_loaded)
860 feedkeys("i\<C-X>\<C-T>\<C-N>\<Esc>", 'xt')
861 assert_equal('experiment', getline(1))
862 assert_equal('yes', g:completion_loaded)
863 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000864 v9.CheckScriptSuccess(lines)
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000865
866 set thesaurusfunc=
867 bwipe!
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000868 &rtp = save_rtp
869enddef
870
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000871def Test_use_autoload_import_partial_in_opfunc()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100872 mkdir('Xpartdir/autoload', 'pR')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000873 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100874 exe 'set rtp^=' .. getcwd() .. '/Xpartdir'
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000875
876 var lines =<< trim END
877 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100878 export def Opfunc1(..._)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000879 g:opfunc_called = 'yes'
880 enddef
881 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100882 writefile(lines, 'Xpartdir/autoload/opfunc.vim')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000883
884 new
885 lines =<< trim END
886 vim9script
887 import autoload 'opfunc.vim'
888 nnoremap <expr> <F3> TheFunc()
889 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100890 &operatorfunc = function('opfunc.Opfunc1', [0])
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000891 return 'g@'
892 enddef
893 feedkeys("\<F3>l", 'xt')
894 assert_equal('yes', g:opfunc_called)
895 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000896 v9.CheckScriptSuccess(lines)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000897
898 set opfunc=
899 bwipe!
Bram Moolenaar06b77222022-01-25 15:51:56 +0000900 nunmap <F3>
901 &rtp = save_rtp
902enddef
903
904def Test_set_opfunc_to_autoload_func_directly()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100905 mkdir('Xdirdir/autoload', 'pR')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000906 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100907 exe 'set rtp^=' .. getcwd() .. '/Xdirdir'
Bram Moolenaar06b77222022-01-25 15:51:56 +0000908
909 var lines =<< trim END
910 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100911 export def Opfunc2(..._)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000912 g:opfunc_called = 'yes'
913 enddef
914 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100915 writefile(lines, 'Xdirdir/autoload/opfunc.vim')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000916
917 new
918 lines =<< trim END
919 vim9script
920 import autoload 'opfunc.vim'
921 nnoremap <expr> <F3> TheFunc()
922 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100923 &operatorfunc = opfunc.Opfunc2
Bram Moolenaar06b77222022-01-25 15:51:56 +0000924 return 'g@'
925 enddef
926 feedkeys("\<F3>l", 'xt')
927 assert_equal('yes', g:opfunc_called)
928 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000929 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000930
931 set opfunc=
932 bwipe!
Bram Moolenaar06b77222022-01-25 15:51:56 +0000933 nunmap <F3>
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000934 &rtp = save_rtp
935enddef
936
Bram Moolenaare70dd112022-01-21 16:31:11 +0000937def Test_use_autoload_import_in_fold_expression()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100938 mkdir('Xfolddir/autoload', 'pR')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000939 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100940 exe 'set rtp^=' .. getcwd() .. '/Xfolddir'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000941
942 var lines =<< trim END
943 vim9script
944 export def Expr(): string
945 return getline(v:lnum) =~ '^#' ? '>1' : '1'
946 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000947 export def Text(): string
948 return 'fold text'
949 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000950 g:fold_loaded = 'yes'
951 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100952 writefile(lines, 'Xfolddir/autoload/fold.vim')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000953
954 lines =<< trim END
955 vim9script
956 import autoload 'fold.vim'
957 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000958 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000959 &foldmethod = 'expr'
960 &debug = 'throw'
961 END
962 new
963 setline(1, ['# one', 'text', '# two', 'text'])
964 g:fold_loaded = 'no'
Bram Moolenaar62aec932022-01-29 21:45:34 +0000965 v9.CheckScriptSuccess(lines)
Bram Moolenaare70dd112022-01-21 16:31:11 +0000966 assert_equal('no', g:fold_loaded)
967 redraw
968 assert_equal('yes', g:fold_loaded)
969
970 # Check that script context of 'foldexpr' is copied to another buffer.
971 edit! otherfile
972 redraw
973
Bram Moolenaar9530b582022-01-22 13:39:08 +0000974 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +0000975 bwipe!
Bram Moolenaare70dd112022-01-21 16:31:11 +0000976 &rtp = save_rtp
977enddef
978
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100979def Test_autoload_import_relative()
980 var lines =<< trim END
981 vim9script
982
983 g:loaded = 'yes'
984 export def RelFunc(): string
985 return 'relfunc'
986 enddef
987 def NotExported()
988 echo 'not'
989 enddef
990
991 export var someText = 'some text'
992 var notexp = 'bad'
993 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100994 writefile(lines, 'XimportRel.vim', 'D')
995 writefile(lines, 'XimportRel2.vim', 'D')
996 writefile(lines, 'XimportRel3.vim', 'D')
997 writefile(lines, 'XimportRel4.vim', 'D')
998 writefile(lines, 'XimportRel5.vim', 'D')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100999
1000 lines =<< trim END
1001 vim9script
1002 g:loaded = 'no'
1003 import autoload './XimportRel.vim'
1004 assert_equal('no', g:loaded)
1005
1006 def AFunc(): string
1007 var res = ''
1008 res ..= XimportRel.RelFunc()
1009 res ..= '/'
1010 res ..= XimportRel.someText
1011 XimportRel.someText = 'from AFunc'
1012 return res
1013 enddef
1014 # script not loaded when compiling
1015 defcompile
1016 assert_equal('no', g:loaded)
1017
1018 assert_equal('relfunc/some text', AFunc())
1019 assert_equal('yes', g:loaded)
1020 unlet g:loaded
1021
1022 assert_equal('from AFunc', XimportRel.someText)
1023 XimportRel.someText = 'from script'
1024 assert_equal('from script', XimportRel.someText)
1025 END
1026 v9.CheckScriptSuccess(lines)
1027
1028 lines =<< trim END
1029 vim9script
1030 import autoload './XimportRel.vim'
1031 echo XimportRel.NotExported()
1032 END
1033 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 3)
1034
1035 lines =<< trim END
1036 vim9script
1037 import autoload './XimportRel.vim'
1038 echo XimportRel.notexp
1039 END
1040 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1041
1042 lines =<< trim END
1043 vim9script
1044 import autoload './XimportRel.vim'
1045 XimportRel.notexp = 'bad'
1046 END
1047 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1048
1049 lines =<< trim END
1050 vim9script
1051 import autoload './XimportRel.vim'
1052 def Func()
1053 echo XimportRel.NotExported()
1054 enddef
1055 Func()
1056 END
1057 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 1)
1058
1059 lines =<< trim END
1060 vim9script
1061 import autoload './XimportRel.vim'
1062 def Func()
1063 echo XimportRel.notexp
1064 enddef
1065 Func()
1066 END
1067 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1068
Bram Moolenaar10611952022-04-03 21:11:34 +01001069 # Same, script not imported before
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001070 lines =<< trim END
1071 vim9script
Bram Moolenaar10611952022-04-03 21:11:34 +01001072 import autoload './XimportRel4.vim'
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001073 def Func()
Bram Moolenaar10611952022-04-03 21:11:34 +01001074 echo XimportRel4.notexp
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001075 enddef
1076 Func()
1077 END
1078 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1079
Bram Moolenaar10611952022-04-03 21:11:34 +01001080 # does not fail if the script wasn't loaded yet and only compiling
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001081 g:loaded = 'no'
1082 lines =<< trim END
1083 vim9script
1084 import autoload './XimportRel2.vim'
1085 def Func()
1086 echo XimportRel2.notexp
1087 enddef
1088 defcompile
1089 END
1090 v9.CheckScriptSuccess(lines)
1091 assert_equal('no', g:loaded)
1092
Bram Moolenaar10611952022-04-03 21:11:34 +01001093 lines =<< trim END
1094 vim9script
1095 import autoload './XimportRel.vim'
1096 def Func()
1097 XimportRel.notexp = 'bad'
1098 enddef
1099 Func()
1100 END
1101 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1102
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001103 # fails with a not loaded import
1104 lines =<< trim END
1105 vim9script
1106 import autoload './XimportRel3.vim'
1107 def Func()
1108 XimportRel3.notexp = 'bad'
1109 enddef
1110 Func()
1111 END
1112 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1113 assert_equal('yes', g:loaded)
1114 unlet g:loaded
1115
Bram Moolenaar10611952022-04-03 21:11:34 +01001116 lines =<< trim END
1117 vim9script
1118 import autoload './XimportRel5.vim'
1119 def Func()
1120 XimportRel5.nosuchvar = 'bad'
1121 enddef
1122 Func()
1123 END
1124 v9.CheckScriptFailure(lines, 'E121: Undefined variable: nosuchvar', 1)
1125 unlet g:loaded
1126
1127 # nasty: delete script after compiling function
1128 writefile(['vim9script'], 'XimportRelDel.vim')
1129 lines =<< trim END
1130 vim9script
1131
1132 import autoload './XimportRelDel.vim'
1133 def DoIt()
1134 echo XimportRelDel.var
1135 enddef
1136 defcompile
1137 delete('XimportRelDel.vim')
1138 DoIt()
1139 END
Bram Moolenaar242c1522022-04-03 21:52:51 +01001140 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001141enddef
1142
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001143def Test_autoload_import_relative_compiled_buffer()
1144 if !has('unix')
1145 # temporary, until it's discovered why the test fails on Windows.
1146 CheckUnix
1147 return
1148 endif
1149 # autoload relative, access from compiled function. #14565, #14579
Ernie Rael1433ac92024-04-17 22:36:32 +02001150 var lines =<< trim END
1151 vim9script
1152
1153 export def F1(): string
1154 return 'InFile.vim'
1155 enddef
1156 END
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001157 writefile(lines, 'Ximportrelativebuffer.vim', 'D')
Ernie Rael1433ac92024-04-17 22:36:32 +02001158 lines =<< trim END
1159 vim9script
1160
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001161 import autoload './Ximportrelativebuffer.vim' as xfile
Ernie Rael1433ac92024-04-17 22:36:32 +02001162
1163 def F(): string
1164 return xfile.F1()
1165 enddef
1166 assert_equal('InFile.vim', F())
1167 END
1168 new
1169 setline(1, lines)
1170 :source
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001171 :bw!
Ernie Rael1433ac92024-04-17 22:36:32 +02001172enddef
1173
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001174def Test_autoload_import_relative_autoload_dir()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001175 mkdir('autoload', 'pR')
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001176 var lines =<< trim END
1177 vim9script
1178 export def Bar()
1179 g:called_bar = 'yes'
1180 enddef
1181 END
1182 writefile(lines, 'autoload/script.vim')
1183
1184 lines =<< trim END
1185 vim9script
1186 import autoload './autoload/script.vim'
1187 def Foo()
1188 script.Bar()
1189 enddef
1190 Foo()
1191 assert_equal('yes', g:called_bar)
1192 END
1193 v9.CheckScriptSuccess(lines)
1194
1195 unlet g:called_bar
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001196enddef
1197
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001198def Test_autoload_import_deleted()
1199 var lines =<< trim END
1200 vim9script
1201 export const FOO = 1
1202 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001203 writefile(lines, 'Xa.vim', 'D')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001204
1205 lines =<< trim END
1206 vim9script
1207 import autoload './Xa.vim'
1208
1209 delete('Xa.vim')
1210 var x = Xa.FOO
1211 END
1212 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001213enddef
1214
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01001215def Test_autoload_import_using_const()
1216 mkdir('Xdir/autoload', 'pR')
1217 var lines =<< trim END
1218 vim9script
1219 export const FOO = 42
1220 echomsg FOO
1221 END
1222 writefile(lines, 'Xdir/autoload/exp.vim')
1223
1224 var save_rtp = &rtp
1225 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1226 lines =<< trim END
1227 vim9script
1228 import autoload 'exp.vim'
1229 assert_equal(42, exp.FOO)
1230 END
1231 v9.CheckScriptSuccess(lines)
1232 &rtp = save_rtp
1233enddef
1234
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001235func Test_import_in_diffexpr()
1236 CheckExecutable diff
1237
1238 call Run_Test_import_in_diffexpr()
1239endfunc
1240
1241def Run_Test_import_in_diffexpr()
1242 var lines =<< trim END
1243 vim9script
1244
1245 export def DiffExpr()
1246 # Prepend some text to check diff type detection
1247 writefile(['warning', ' message'], v:fname_out)
1248 silent exe '!diff ' .. v:fname_in .. ' '
1249 .. v:fname_new .. '>>' .. v:fname_out
1250 enddef
1251 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001252 writefile(lines, 'Xdiffexpr', 'D')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001253
1254 lines =<< trim END
1255 vim9script
1256 import './Xdiffexpr' as diff
1257
1258 set diffexpr=diff.DiffExpr()
1259 set diffopt=foldcolumn:0
1260 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001261 v9.CheckScriptSuccess(lines)
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001262
1263 enew!
1264 call setline(1, ['one', 'two', 'three'])
1265 diffthis
1266
1267 botright vert new
1268 call setline(1, ['one', 'two', 'three.'])
1269 diffthis
1270 # we only check if this does not cause errors
1271 redraw
1272
1273 diffoff!
Bram Moolenaar50761872022-06-26 18:01:00 +01001274 set diffexpr=
1275 set diffopt&
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001276 bwipe!
1277 bwipe!
1278enddef
1279
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001280def Test_import_in_patchexpr()
1281 var lines =<< trim END
1282 vim9script
1283 export def TPatch()
1284 call writefile(['output file'], v:fname_out)
1285 enddef
1286 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001287 writefile(lines, 'Xpatchexpr', 'D')
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001288
1289 lines =<< trim END
1290 vim9script
1291 import './Xpatchexpr' as patch
1292 set patchexpr=patch.TPatch()
1293 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001294 v9.CheckScriptSuccess(lines)
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001295
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001296 call writefile(['input file'], 'Xinput', 'D')
1297 call writefile(['diff file'], 'Xdiff', 'D')
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001298 :%bwipe!
1299 edit Xinput
1300 diffpatch Xdiff
1301 call assert_equal('output file', getline(1))
1302
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001303 set patchexpr&
1304 :%bwipe!
1305enddef
1306
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001307def Test_import_in_formatexpr()
1308 var lines =<< trim END
1309 vim9script
1310 export def MyFormatExpr(): number
1311 g:did_format = 'yes'
1312 return 0
1313 enddef
1314 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001315 writefile(lines, 'Xformatter', 'D')
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001316
1317 lines =<< trim END
1318 vim9script
1319 import './Xformatter' as format
1320 set formatexpr=format.MyFormatExpr()
1321 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001322 v9.CheckScriptSuccess(lines)
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001323
1324 new
1325 setline(1, ['a', 'b', 'c'])
1326 normal gqG
1327 assert_equal('yes', g:did_format)
1328
1329 bwipe!
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001330 unlet g:did_format
1331 set formatexpr=
1332enddef
1333
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001334def Test_import_in_includeexpr()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001335 writefile(['found it'], 'Xthisfile', 'D')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001336 new
1337
1338 var lines =<< trim END
1339 vim9script
1340 export def DoSub(): string
1341 return substitute(v:fname, 'that', 'this', '')
1342 enddef
1343 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001344 writefile(lines, 'Xinclude.vim', 'D')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001345
1346 lines =<< trim END
1347 vim9script
1348 import './Xinclude.vim'
1349 set includeexpr=Xinclude.DoSub()
1350 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001351 v9.CheckScriptSuccess(lines)
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001352
1353 setline(1, ['Xthatfile'])
1354 exe "normal \<C-W>f"
1355 assert_equal('Xthisfile', expand('%'))
1356
1357 bwipe!
1358 bwipe!
1359 set includeexpr=
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001360enddef
1361
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001362def Test_import_in_indentexpr()
1363 var lines =<< trim END
1364 vim9script
1365 export def GetIndent(): number
1366 return 5
1367 enddef
1368 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001369 writefile(lines, 'Xindenter', 'D')
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001370
1371 lines =<< trim END
1372 vim9script
1373 import './Xindenter' as indent
1374 set indentexpr=indent.GetIndent()
1375 set debug=throw
1376 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001377 v9.CheckScriptSuccess(lines)
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001378
1379 new
1380 setline(1, 'hello')
1381 normal ==
1382 assert_equal(' hello', getline(1))
1383
1384 bwipe!
1385 set indentexpr= debug=
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001386enddef
1387
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001388func Test_import_in_printexpr()
1389 CheckFeature postscript
1390 call Run_Test_import_in_printexpr()
1391endfunc
1392
1393def Run_Test_import_in_printexpr()
1394 var lines =<< trim END
1395 vim9script
1396 export def PrintFile(): bool
1397 g:printed = 'yes'
1398 delete('v:fname_in')
1399 return false
1400 enddef
1401 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001402 writefile(lines, 'Xprint.vim', 'D')
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001403
1404 lines =<< trim END
1405 vim9script
1406 import './Xprint.vim'
1407 set printexpr=Xprint.PrintFile()
1408 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001409 v9.CheckScriptSuccess(lines)
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001410
1411 help
1412 hardcopy dummy args
1413 assert_equal('yes', g:printed)
1414
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001415 set printexpr=
1416enddef
1417
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001418def Test_import_in_charconvert()
1419 var lines =<< trim END
1420 vim9script
1421 export def MakeUpper(): bool
1422 var data = readfile(v:fname_in)
1423 map(data, 'toupper(v:val)')
1424 writefile(data, v:fname_out)
1425 return false # success
1426 enddef
1427 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001428 writefile(lines, 'Xconvert.vim', 'D')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001429
1430 lines =<< trim END
1431 vim9script
1432 import './Xconvert.vim' as conv
1433 set charconvert=conv.MakeUpper()
1434 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001435 v9.CheckScriptSuccess(lines)
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001436
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001437 writefile(['one', 'two'], 'Xiicfile', 'D')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001438 new Xiicfile
1439 write ++enc=ucase Xiicfile1
1440 assert_equal(['ONE', 'TWO'], readfile('Xiicfile1'))
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001441
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001442 delete('Xiicfile1')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001443 bwipe!
1444 set charconvert&
1445enddef
1446
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001447func Test_import_in_spellsuggest_expr()
1448 CheckFeature spell
1449 call Run_Test_import_in_spellsuggest_expr()
1450endfunc
1451
1452def Run_Test_import_in_spellsuggest_expr()
1453 var lines =<< trim END
1454 vim9script
1455 export def MySuggest(): list<any>
1456 return [['Fox', 8], ['Fop', 9]]
1457 enddef
1458 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001459 writefile(lines, 'Xsuggest.vim', 'D')
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001460
1461 lines =<< trim END
1462 vim9script
1463 import './Xsuggest.vim' as sugg
1464 set spell spellsuggest=expr:sugg.MySuggest()
1465 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001466 v9.CheckScriptSuccess(lines)
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001467
1468 set verbose=1 # report errors
1469 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
1470
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001471 set nospell spellsuggest& verbose=0
1472enddef
1473
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001474def Test_import_in_lambda_method()
1475 var lines =<< trim END
1476 vim9script
1477 export def Retarg(e: any): any
1478 return e
1479 enddef
1480 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001481 writefile(lines, 'XexportRetarg.vim', 'D')
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001482 lines =<< trim END
1483 vim9script
1484 import './XexportRetarg.vim'
1485 def Lambda(): string
1486 var F = (x) => x->XexportRetarg.Retarg()
1487 return F('arg')
1488 enddef
1489 assert_equal('arg', Lambda())
1490 END
1491 v9.CheckScriptSuccess(lines)
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001492enddef
1493
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001494def Test_export_shadows_global_function()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001495 mkdir('Xglobdir/autoload', 'pR')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001496 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001497 exe 'set rtp^=' .. getcwd() .. '/Xglobdir'
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001498
1499 var lines =<< trim END
1500 vim9script
1501 export def Shadow(): string
1502 return 'Shadow()'
1503 enddef
1504 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001505 writefile(lines, 'Xglobdir/autoload/shadow.vim')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001506
1507 lines =<< trim END
1508 vim9script
1509
1510 def g:Shadow(): string
1511 return 'global'
1512 enddef
1513
1514 import autoload 'shadow.vim'
1515 assert_equal('Shadow()', shadow.Shadow())
1516 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001517 v9.CheckScriptSuccess(lines)
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001518
1519 delfunc g:Shadow
1520 bwipe!
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001521 &rtp = save_rtp
1522enddef
1523
Bram Moolenaard8448622022-01-07 21:39:52 +00001524def Test_export_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001525 v9.CheckScriptFailure(['export var some = 123'], 'E1042:')
1526 v9.CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1527 v9.CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01001528 v9.CheckScriptFailure(['vim9script', 'export function /a1b2c3'], 'E1044:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001529
Bram Moolenaar5ab30012022-10-07 17:26:22 +01001530 assert_fails('export echo 1', 'E1043:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001531enddef
1532
1533func Test_import_fails_without_script()
1534 CheckRunVimInTerminal
1535
1536 " call indirectly to avoid compilation error for missing functions
1537 call Run_Test_import_fails_on_command_line()
1538endfunc
1539
1540def Run_Test_import_fails_on_command_line()
1541 var export =<< trim END
1542 vim9script
1543 export def Foo(): number
1544 return 0
1545 enddef
1546 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001547 writefile(export, 'XexportCmd.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001548
Bram Moolenaar62aec932022-01-29 21:45:34 +00001549 var buf = g:RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaard8448622022-01-07 21:39:52 +00001550 rows: 6, wait_for_ruler: 0})
Bram Moolenaar62aec932022-01-29 21:45:34 +00001551 g:WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaard8448622022-01-07 21:39:52 +00001552
Bram Moolenaar62aec932022-01-29 21:45:34 +00001553 g:StopVimInTerminal(buf)
Bram Moolenaard8448622022-01-07 21:39:52 +00001554enddef
1555
1556def Test_vim9_reload_noclear()
1557 var lines =<< trim END
1558 vim9script
1559 export var exported = 'thexport'
1560
1561 export def TheFunc(x = 0)
1562 enddef
1563 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001564 writefile(lines, 'XExportReload', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001565 lines =<< trim END
1566 vim9script noclear
1567 g:loadCount += 1
Bram Moolenaara749a422022-02-12 19:52:25 +00001568 var reloaded = 'init'
Bram Moolenaard8448622022-01-07 21:39:52 +00001569 import './XExportReload' as exp
1570
1571 def Again(): string
1572 return 'again'
1573 enddef
1574
1575 exp.TheFunc()
1576
Bram Moolenaara749a422022-02-12 19:52:25 +00001577 if exists('loaded') | finish | endif
1578 var loaded = true
Bram Moolenaard8448622022-01-07 21:39:52 +00001579
Bram Moolenaara749a422022-02-12 19:52:25 +00001580 var notReloaded = 'yes'
1581 reloaded = 'first'
Bram Moolenaard8448622022-01-07 21:39:52 +00001582 def g:Values(): list<string>
Bram Moolenaara749a422022-02-12 19:52:25 +00001583 return [reloaded, notReloaded, Again(), Once(), exp.exported]
Bram Moolenaard8448622022-01-07 21:39:52 +00001584 enddef
1585
1586 def Once(): string
1587 return 'once'
1588 enddef
1589 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001590 writefile(lines, 'XReloaded', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001591 g:loadCount = 0
1592 source XReloaded
1593 assert_equal(1, g:loadCount)
1594 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1595 source XReloaded
1596 assert_equal(2, g:loadCount)
1597 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1598 source XReloaded
1599 assert_equal(3, g:loadCount)
1600 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1601
Bram Moolenaard8448622022-01-07 21:39:52 +00001602 delfunc g:Values
1603 unlet g:loadCount
1604
1605 lines =<< trim END
1606 vim9script
1607 def Inner()
1608 enddef
1609 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001610 lines->writefile('XreloadScript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001611 source XreloadScript.vim
1612
1613 lines =<< trim END
1614 vim9script
1615 def Outer()
1616 def Inner()
1617 enddef
1618 enddef
1619 defcompile
1620 END
1621 lines->writefile('XreloadScript.vim')
1622 source XreloadScript.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00001623enddef
1624
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001625def Test_vim_reload_noclear_arg_count()
1626 var lines =<< trim END
1627 vim9script noclear
1628
1629 if !exists('g:didload')
1630 def Test(a: string, b: string)
1631 echo a b
1632 enddef
1633 def Call()
1634 Test('a', 'b')
1635 enddef
1636 else
1637 # redefine with one argument less
1638 def Test(a: string)
1639 echo a
1640 enddef
1641 endif
1642 Call()
1643 g:didload = 1
1644 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001645 lines->writefile('XreloadScript_1.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001646 source XreloadScript_1.vim
1647 assert_fails('source XreloadScript_1.vim', 'E1106: One argument too many')
1648 unlet g:didload
1649
1650 lines =<< trim END
1651 vim9script noclear
1652
1653 if !exists('g:didload')
1654 def Test(a: string, b: string, c: string)
1655 echo a b
1656 enddef
1657 def Call()
1658 Test('a', 'b', 'c')
1659 enddef
1660 else
1661 # redefine with one argument less
1662 def Test(a: string)
1663 echo a
1664 enddef
1665 endif
1666 Call()
1667 g:didload = 1
1668 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001669 lines->writefile('XreloadScript_2.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001670 source XreloadScript_2.vim
1671 assert_fails('source XreloadScript_2.vim', 'E1106: 2 arguments too many')
1672 unlet g:didload
1673
1674 lines =<< trim END
1675 vim9script noclear
1676
1677 if !exists('g:didload')
1678 def Test(a: string)
1679 echo a
1680 enddef
1681 def Call()
1682 Test('a')
1683 enddef
1684 else
1685 # redefine with one argument extra
1686 def Test(a: string, b: string)
1687 echo a b
1688 enddef
1689 endif
1690 Call()
1691 g:didload = 1
1692 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001693 lines->writefile('XreloadScript_3.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001694 source XreloadScript_3.vim
1695 assert_fails('source XreloadScript_3.vim', 'E1190: One argument too few')
1696 unlet g:didload
1697
1698 lines =<< trim END
1699 vim9script noclear
1700
1701 if !exists('g:didload')
1702 def Test(a: string)
1703 echo a
1704 enddef
1705 def Call()
1706 Test('a')
1707 enddef
1708 else
1709 # redefine with two arguments extra
1710 def Test(a: string, b: string, c: string)
1711 echo a b
1712 enddef
1713 endif
1714 Call()
1715 g:didload = 1
1716 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001717 lines->writefile('XreloadScript_4.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001718 source XreloadScript_4.vim
1719 assert_fails('source XreloadScript_4.vim', 'E1190: 2 arguments too few')
1720 unlet g:didload
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001721enddef
1722
1723def Test_vim9_reload_noclear_error()
1724 var lines =<< trim END
1725 vim9script noclear
1726
1727 if !exists('g:didload')
1728 def Test(a: string)
1729 echo a
1730 enddef
1731 def Call()
1732 Test('a')
1733 enddef
1734 else
1735 # redefine with a compile error
1736 def Test(a: string)
1737 echo ax
1738 enddef
1739 endif
1740 Call()
1741 g:didload = 1
1742 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001743 lines->writefile('XreloadScriptErr.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001744 source XreloadScriptErr.vim
1745 assert_fails('source XreloadScriptErr.vim', 'E1001: Variable not found: ax')
1746
1747 unlet g:didload
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001748enddef
1749
Bram Moolenaard8448622022-01-07 21:39:52 +00001750def Test_vim9_reload_import()
1751 var lines =<< trim END
1752 vim9script
1753 const var = ''
1754 var valone = 1234
1755 def MyFunc(arg: string)
1756 valone = 5678
1757 enddef
1758 END
1759 var morelines =<< trim END
1760 var valtwo = 222
1761 export def GetValtwo(): number
1762 return valtwo
1763 enddef
1764 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001765 writefile(lines + morelines, 'Xreload.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001766 source Xreload.vim
1767 source Xreload.vim
1768 source Xreload.vim
1769
1770 # cannot declare a var twice
1771 lines =<< trim END
1772 vim9script
1773 var valone = 1234
1774 var valone = 5678
1775 END
1776 writefile(lines, 'Xreload.vim')
1777 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1778
Bram Moolenaard8448622022-01-07 21:39:52 +00001779 delete('Ximport.vim')
1780enddef
1781
1782" if a script is reloaded with a script-local variable that changed its type, a
1783" compiled function using that variable must fail.
1784def Test_script_reload_change_type()
1785 var lines =<< trim END
1786 vim9script noclear
1787 var str = 'string'
1788 def g:GetStr(): string
1789 return str .. 'xxx'
1790 enddef
1791 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001792 writefile(lines, 'Xreload.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001793 source Xreload.vim
1794 echo g:GetStr()
1795
1796 lines =<< trim END
1797 vim9script noclear
1798 var str = 1234
1799 END
1800 writefile(lines, 'Xreload.vim')
1801 source Xreload.vim
1802 assert_fails('echo g:GetStr()', 'E1150:')
1803
1804 delfunc g:GetStr
Bram Moolenaard8448622022-01-07 21:39:52 +00001805enddef
1806
1807" Define CallFunc so that the test can be compiled
1808command CallFunc echo 'nop'
1809
1810def Test_script_reload_from_function()
1811 var lines =<< trim END
1812 vim9script
1813
Bram Moolenaar10611952022-04-03 21:11:34 +01001814 if exists('g:loadedThis')
Bram Moolenaard8448622022-01-07 21:39:52 +00001815 finish
1816 endif
Bram Moolenaar10611952022-04-03 21:11:34 +01001817 g:loadedThis = 1
Bram Moolenaard8448622022-01-07 21:39:52 +00001818 delcommand CallFunc
1819 command CallFunc Func()
1820 def Func()
1821 so XreloadFunc.vim
1822 g:didTheFunc = 1
1823 enddef
1824 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001825 writefile(lines, 'XreloadFunc.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001826 source XreloadFunc.vim
1827 CallFunc
1828 assert_equal(1, g:didTheFunc)
1829
Bram Moolenaard8448622022-01-07 21:39:52 +00001830 delcommand CallFunc
Bram Moolenaar10611952022-04-03 21:11:34 +01001831 unlet g:loadedThis
Bram Moolenaard8448622022-01-07 21:39:52 +00001832 unlet g:didTheFunc
1833enddef
1834
1835def s:RetSome(): string
1836 return 'some'
1837enddef
1838
1839" Not exported function that is referenced needs to be accessed by the
1840" script-local name.
1841def Test_vim9_funcref()
1842 var sortlines =<< trim END
1843 vim9script
1844 def Compare(i1: number, i2: number): number
1845 return i2 - i1
1846 enddef
1847
1848 export def FastSort(): list<number>
1849 return range(5)->sort(Compare)
1850 enddef
1851
1852 export def GetString(arg: string): string
1853 return arg
1854 enddef
1855 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001856 writefile(sortlines, 'Xsort.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001857
1858 var lines =<< trim END
1859 vim9script
1860 import './Xsort.vim'
1861 def Test()
1862 g:result = Xsort.FastSort()
1863 enddef
1864 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001865 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001866 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001867 source Xscript.vim
1868 assert_equal([4, 3, 2, 1, 0], g:result)
1869 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00001870
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001871 lines =<< trim END
1872 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00001873 # using a function imported with "as"
1874 import './Xsort.vim' as anAlias
1875 assert_equal('yes', anAlias.GetString('yes'))
1876
1877 # using the function from a compiled function
1878 def TestMore(): string
1879 var s = s:anAlias.GetString('foo')
1880 return s .. anAlias.GetString('bar')
1881 enddef
1882 assert_equal('foobar', TestMore())
1883
1884 # error when using a function that isn't exported
1885 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1886 END
1887 writefile(lines, 'Xscript.vim')
1888
Bram Moolenaard8448622022-01-07 21:39:52 +00001889 var Funcref = function('s:RetSome')
1890 assert_equal('some', Funcref())
1891enddef
1892
1893" Check that when searching for "FilterFunc" it finds the import in the
1894" script where FastFilter() is called from, both as a string and as a direct
1895" function reference.
1896def Test_vim9_funcref_other_script()
1897 var filterLines =<< trim END
1898 vim9script
1899 export def FilterFunc(idx: number, val: number): bool
1900 return idx % 2 == 1
1901 enddef
1902 export def FastFilter(): list<number>
1903 return range(10)->filter('FilterFunc(v:key, v:val)')
1904 enddef
1905 export def FastFilterDirect(): list<number>
1906 return range(10)->filter(FilterFunc)
1907 enddef
1908 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001909 writefile(filterLines, 'Xfilter.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001910
1911 var lines =<< trim END
1912 vim9script
1913 import './Xfilter.vim' as filter
1914 def Test()
1915 var x: list<number> = filter.FastFilter()
1916 enddef
1917 Test()
1918 def TestDirect()
1919 var x: list<number> = filter.FastFilterDirect()
1920 enddef
1921 TestDirect()
1922 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001923 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +00001924enddef
1925
1926def Test_import_absolute()
1927 var import_lines = [
1928 'vim9script',
1929 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
1930 'def UseExported()',
1931 ' g:imported_abs = abs.exported',
1932 ' abs.exported = 8888',
1933 ' g:imported_after = abs.exported',
1934 'enddef',
1935 'UseExported()',
1936 'g:import_disassembled = execute("disass UseExported")',
1937 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001938 writefile(import_lines, 'Ximport_abs.vim', 'D')
1939 writefile(s:export_script_lines, 'Xexport_abs.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001940
1941 source Ximport_abs.vim
1942
1943 assert_equal(9876, g:imported_abs)
1944 assert_equal(8888, g:imported_after)
1945 assert_match('<SNR>\d\+_UseExported\_s*' ..
1946 'g:imported_abs = abs.exported\_s*' ..
1947 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1948 '1 STOREG g:imported_abs\_s*' ..
1949 'abs.exported = 8888\_s*' ..
1950 '2 PUSHNR 8888\_s*' ..
1951 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1952 'g:imported_after = abs.exported\_s*' ..
1953 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1954 '5 STOREG g:imported_after',
1955 g:import_disassembled)
1956
1957 Undo_export_script_lines()
1958 unlet g:imported_abs
1959 unlet g:import_disassembled
Bram Moolenaard8448622022-01-07 21:39:52 +00001960enddef
1961
1962def Test_import_rtp()
1963 var import_lines = [
1964 'vim9script',
1965 'import "Xexport_rtp.vim" as rtp',
1966 'g:imported_rtp = rtp.exported',
1967 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001968 writefile(import_lines, 'Ximport_rtp.vim', 'D')
1969 mkdir('import', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +00001970 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1971
1972 var save_rtp = &rtp
1973 &rtp = getcwd()
1974 source Ximport_rtp.vim
1975 &rtp = save_rtp
1976
1977 assert_equal(9876, g:imported_rtp)
1978
1979 Undo_export_script_lines()
1980 unlet g:imported_rtp
Bram Moolenaard8448622022-01-07 21:39:52 +00001981enddef
1982
1983def Test_import_compile_error()
1984 var export_lines = [
1985 'vim9script',
1986 'export def ExpFunc(): string',
1987 ' return notDefined',
1988 'enddef',
1989 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001990 writefile(export_lines, 'Xexported.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001991
1992 var import_lines = [
1993 'vim9script',
1994 'import "./Xexported.vim" as expo',
1995 'def ImpFunc()',
1996 ' echo expo.ExpFunc()',
1997 'enddef',
1998 'defcompile',
1999 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002000 writefile(import_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002001
2002 try
2003 source Ximport.vim
2004 catch /E1001/
2005 # Error should be before the Xexported.vim file.
2006 assert_match('E1001: Variable not found: notDefined', v:exception)
2007 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
2008 endtry
Bram Moolenaard8448622022-01-07 21:39:52 +00002009enddef
2010
2011def Test_func_overrules_import_fails()
2012 var export_lines =<< trim END
2013 vim9script
2014 export def Func()
2015 echo 'imported'
2016 enddef
2017 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002018 writefile(export_lines, 'XexportedFunc.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002019
2020 var lines =<< trim END
2021 vim9script
2022 import './XexportedFunc.vim' as Func
2023 def Func()
2024 echo 'local to function'
2025 enddef
2026 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002027 v9.CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00002028
2029 lines =<< trim END
2030 vim9script
2031 import './XexportedFunc.vim' as Func
2032 def Outer()
2033 def Func()
2034 echo 'local to function'
2035 enddef
2036 enddef
2037 defcompile
2038 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002039 v9.CheckScriptFailure(lines, 'E1236:')
Bram Moolenaard8448622022-01-07 21:39:52 +00002040enddef
2041
2042def Test_source_vim9_from_legacy()
2043 var vim9_lines =<< trim END
2044 vim9script
2045 var local = 'local'
2046 g:global = 'global'
2047 export var exported = 'exported'
2048 export def GetText(): string
2049 return 'text'
2050 enddef
2051 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002052 writefile(vim9_lines, 'Xvim9_script.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002053
2054 var legacy_lines =<< trim END
2055 source Xvim9_script.vim
2056
2057 call assert_false(exists('local'))
2058 call assert_false(exists('exported'))
2059 call assert_false(exists('s:exported'))
2060 call assert_equal('global', global)
2061 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00002062 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002063 writefile(legacy_lines, 'Xlegacy_script.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002064
2065 source Xlegacy_script.vim
2066 assert_equal('global', g:global)
2067 unlet g:global
Bram Moolenaarb775e722022-11-22 18:12:44 +00002068
2069 legacy_lines =<< trim END
2070 import './Xvim9_script.vim'
2071 let g:global = s:Xvim9_script.GetText()
2072 END
2073 writefile(legacy_lines, 'Xlegacyimport.vim', 'D')
2074 source Xlegacyimport.vim
2075 assert_equal('text', g:global)
2076 unlet g:global
Bram Moolenaard8448622022-01-07 21:39:52 +00002077enddef
2078
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002079def Test_import_vim9_from_legacy()
2080 var vim9_lines =<< trim END
2081 vim9script
2082 var local = 'local'
2083 g:global = 'global'
2084 export var exported = 'exported'
2085 export def GetText(): string
2086 return 'text'
2087 enddef
Yegappan Lakshmananf1750ca2024-04-02 20:41:04 +02002088 export var exported_nr: number = 22
2089 def AddNum(n: number)
2090 exported_nr += n
2091 enddef
2092 export var exportedDict: dict<func> = {Fn: AddNum}
2093 export const CONST = 10
2094 export final finalVar = 'abc'
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002095 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002096 writefile(vim9_lines, 'Xvim9_export.vim', 'D')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002097
2098 var legacy_lines =<< trim END
2099 import './Xvim9_export.vim' as vim9
2100
2101 call assert_false(exists('vim9'))
2102 call assert_false(exists('local'))
2103 call assert_false(exists('s:vim9.local'))
2104 call assert_equal('global', global)
2105 call assert_equal('global', g:global)
2106 call assert_false(exists('exported'))
2107 call assert_false(exists('s:exported'))
2108 call assert_false(exists('*GetText'))
2109
2110 " imported symbol is script-local
2111 call assert_equal('exported', s:vim9.exported)
2112 call assert_equal('text', s:vim9.GetText())
Yegappan Lakshmananf1750ca2024-04-02 20:41:04 +02002113 call s:vim9.exportedDict.Fn(5)
2114 call assert_equal(27, s:vim9.exported_nr)
2115 call call(s:vim9.exportedDict.Fn, [3])
2116 call assert_equal(30, s:vim9.exported_nr)
2117 call assert_fails('let s:vim9.CONST = 20', 'E46: Cannot change read-only variable "CONST"')
2118 call assert_fails('let s:vim9.finalVar = ""', 'E46: Cannot change read-only variable "finalVar"')
2119 call assert_fails('let s:vim9.non_existing_var = 20', 'E1048: Item not found in script: non_existing_var')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002120 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002121 writefile(legacy_lines, 'Xlegacy_script.vim', 'D')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002122
2123 source Xlegacy_script.vim
2124 assert_equal('global', g:global)
2125 unlet g:global
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002126enddef
2127
Bram Moolenaard8448622022-01-07 21:39:52 +00002128def Test_cmdline_win()
2129 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
2130 # the command line window.
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002131 mkdir('rtp/syntax', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +00002132 var export_lines =<< trim END
2133 vim9script
2134 export var That = 'yes'
2135 END
2136 writefile(export_lines, 'rtp/syntax/Xexport.vim')
2137 var import_lines =<< trim END
2138 vim9script
2139 import './Xexport.vim' as exp
2140 echo exp.That
2141 END
2142 writefile(import_lines, 'rtp/syntax/vim.vim')
2143 var save_rtp = &rtp
2144 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
2145 syntax on
2146 augroup CmdWin
2147 autocmd CmdwinEnter * g:got_there = 'yes'
2148 augroup END
2149 # this will open and also close the cmdline window
2150 feedkeys('q:', 'xt')
2151 assert_equal('yes', g:got_there)
2152
2153 augroup CmdWin
2154 au!
2155 augroup END
2156 &rtp = save_rtp
Bram Moolenaard8448622022-01-07 21:39:52 +00002157enddef
2158
2159def Test_import_gone_when_sourced_twice()
2160 var exportlines =<< trim END
2161 vim9script
2162 if exists('g:guard')
2163 finish
2164 endif
2165 g:guard = 1
2166 export var name = 'someName'
2167 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002168 writefile(exportlines, 'XexportScript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002169
2170 var lines =<< trim END
2171 vim9script
2172 import './XexportScript.vim' as expo
2173 def g:GetName(): string
2174 return expo.name
2175 enddef
2176 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002177 writefile(lines, 'XscriptImport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002178 so XscriptImport.vim
2179 assert_equal('someName', g:GetName())
2180
2181 so XexportScript.vim
2182 assert_fails('call g:GetName()', 'E1149:')
2183
2184 delfunc g:GetName
Bram Moolenaard8448622022-01-07 21:39:52 +00002185 unlet g:guard
2186enddef
2187
Bram Moolenaar160aa862022-01-10 21:29:57 +00002188" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002189def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002190 var lines =<< trim END
2191 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002192 export def Gettest(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002193 return 'test'
2194 enddef
2195 g:some#name = 'name'
2196 g:some#dict = {key: 'value'}
2197
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002198 export def Varargs(a1: string, ...l: list<string>): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002199 return a1 .. l[0] .. l[1]
2200 enddef
2201 END
2202
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002203 mkdir('Xfulldir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002204 writefile(lines, 'Xfulldir/autoload/some.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002205 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002206 exe 'set rtp^=' .. getcwd() .. '/Xfulldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002207
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002208 assert_equal('test', g:some#Gettest())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002209 assert_equal('name', g:some#name)
2210 assert_equal('value', g:some#dict.key)
2211 g:some#other = 'other'
2212 assert_equal('other', g:some#other)
2213
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002214 assert_equal('abc', some#Varargs('a', 'b', 'c'))
Bram Moolenaar160aa862022-01-10 21:29:57 +00002215
2216 # upper case script name works
2217 lines =<< trim END
2218 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002219 export def GetOther(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002220 return 'other'
2221 enddef
2222 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002223 writefile(lines, 'Xfulldir/autoload/Other.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002224 assert_equal('other', g:Other#GetOther())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002225
Bram Moolenaar160aa862022-01-10 21:29:57 +00002226 &rtp = save_rtp
2227enddef
2228
2229def Test_vim9script_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002230 mkdir('Xaldir/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002231 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002232 exe 'set rtp^=' .. getcwd() .. '/Xaldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002233
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002234 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00002235 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002236 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002237 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00002238
2239 export def Gettest(): string
2240 return 'test'
2241 enddef
2242
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002243 export var name = 'name'
2244
2245 export func GetFunc()
2246 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00002247 endfunc
2248
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002249 export def GetDef(): string
2250 return Gettest() .. 'more' .. name
2251 enddef
2252
Bram Moolenaar160aa862022-01-10 21:29:57 +00002253 export final fname = 'final'
2254 export const cname = 'const'
2255 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002256 writefile(lines, 'Xaldir/autoload/prefixed.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002257
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002258 g:prefixed_loaded = 0
2259 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00002260 lines =<< trim END
2261 vim9script
2262 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002263 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002264 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002265 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002266
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002267 assert_equal('testmorename', prefixed.GetFunc())
2268 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002269 assert_equal('name', prefixed.name)
2270 assert_equal('final', prefixed.fname)
2271 assert_equal('const', prefixed.cname)
2272 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002273 v9.CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002274 # can source it again, autoload script not loaded again
2275 g:expected_loaded = 1
Bram Moolenaar62aec932022-01-29 21:45:34 +00002276 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002277
2278 # can also get the items by autoload name
2279 lines =<< trim END
2280 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002281 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002282 call assert_equal('name', prefixed#name)
2283 call assert_equal('final', prefixed#fname)
2284 call assert_equal('const', prefixed#cname)
2285 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002286 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002287
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002288 unlet g:prefixed_loaded
2289 unlet g:expected_loaded
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002290 &rtp = save_rtp
2291enddef
2292
Bram Moolenaard02dce22022-01-18 17:43:04 +00002293def Test_import_autoload_not_exported()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002294 mkdir('Xnimdir/autoload', 'pR')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002295 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002296 exe 'set rtp^=' .. getcwd() .. '/Xnimdir'
Bram Moolenaard02dce22022-01-18 17:43:04 +00002297
2298 # error when using an item that is not exported from an autoload script
2299 var exportLines =<< trim END
2300 vim9script
2301 var notExported = 123
2302 def NotExport()
2303 echo 'nop'
2304 enddef
2305 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002306 writefile(exportLines, 'Xnimdir/autoload/notExport1.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002307
2308 var lines =<< trim END
2309 vim9script
2310 import autoload 'notExport1.vim'
2311 echo notExport1.notFound
2312 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002313 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002314
2315 lines =<< trim END
2316 vim9script
2317 import autoload 'notExport1.vim'
2318 echo notExport1.notExported
2319 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002320 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002321
2322 lines =<< trim END
2323 vim9script
2324 import autoload 'notExport1.vim'
2325 echo notExport1.NotFunc()
2326 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002327 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002328
2329 lines =<< trim END
2330 vim9script
2331 import autoload 'notExport1.vim'
2332 echo notExport1.NotExport()
2333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002334 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002335
2336 lines =<< trim END
2337 vim9script
2338 import autoload 'notExport1.vim'
2339 echo 'text'->notExport1.NotFunc()
2340 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002341 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002342
2343 lines =<< trim END
2344 vim9script
2345 import autoload 'notExport1.vim'
2346 echo 'text'->notExport1.NotExport()
2347 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002348 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002349
2350 # using a :def function we use a different autoload script every time so that
2351 # the function is compiled without the script loaded
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002352 writefile(exportLines, 'Xnimdir/autoload/notExport2.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002353 lines =<< trim END
2354 vim9script
2355 import autoload 'notExport2.vim'
2356 def Testit()
2357 echo notExport2.notFound
2358 enddef
2359 Testit()
2360 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002361 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002362
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002363 writefile(exportLines, 'Xnimdir/autoload/notExport3.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002364 lines =<< trim END
2365 vim9script
2366 import autoload 'notExport3.vim'
2367 def Testit()
2368 echo notExport3.notExported
2369 enddef
2370 Testit()
2371 END
2372 # don't get E1049 because it is too complicated to figure out
Bram Moolenaar62aec932022-01-29 21:45:34 +00002373 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002374
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002375 writefile(exportLines, 'Xnimdir/autoload/notExport4.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002376 lines =<< trim END
2377 vim9script
2378 import autoload 'notExport4.vim'
2379 def Testit()
2380 echo notExport4.NotFunc()
2381 enddef
2382 Testit()
2383 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002384 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002385
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002386 writefile(exportLines, 'Xnimdir/autoload/notExport5.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002387 lines =<< trim END
2388 vim9script
2389 import autoload 'notExport5.vim'
2390 def Testit()
2391 echo notExport5.NotExport()
2392 enddef
2393 Testit()
2394 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002395 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002396
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002397 writefile(exportLines, 'Xnimdir/autoload/notExport6.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002398 lines =<< trim END
2399 vim9script
2400 import autoload 'notExport6.vim'
2401 def Testit()
2402 echo 'text'->notExport6.NotFunc()
2403 enddef
2404 Testit()
2405 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002406 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002407
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002408 writefile(exportLines, 'Xnimdir/autoload/notExport7.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002409 lines =<< trim END
2410 vim9script
2411 import autoload 'notExport7.vim'
2412 def Testit()
2413 echo 'text'->notExport7.NotExport()
2414 enddef
2415 Testit()
2416 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002417 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002418
Bram Moolenaard02dce22022-01-18 17:43:04 +00002419 &rtp = save_rtp
2420enddef
2421
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002422def Test_vim9script_autoload_call()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002423 mkdir('Xcalldir/autoload', 'pR')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002424 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002425 exe 'set rtp^=' .. getcwd() .. '/Xcalldir'
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002426
2427 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002428 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002429
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002430 export def RetArg(arg: string): string
2431 return arg
2432 enddef
2433
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002434 export def Getother()
2435 g:result = 'other'
2436 enddef
2437 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002438 writefile(lines, 'Xcalldir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002439
2440 lines =<< trim END
2441 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00002442 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002443
2444 # compile this before 'another.vim' is loaded
2445 def CallAnother()
2446 assert_equal('foo', 'foo'->another.RetArg())
2447 enddef
2448 CallAnother()
2449
Bram Moolenaar5d982692022-01-12 15:15:27 +00002450 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002451 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00002452
2453 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaar8164f6e2022-02-06 13:08:41 +00002454
2455 verbose function another.Getother
2456 # should we disallow this?
2457 verbose function another#Getother
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002458 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002459 v9.CheckScriptSuccess(lines)
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002460
2461 unlet g:result
Bram Moolenaar160aa862022-01-10 21:29:57 +00002462 &rtp = save_rtp
2463enddef
2464
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002465def Test_vim9script_noclear_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002466 mkdir('Xnocdir/autoload', 'pR')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002467 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002468 exe 'set rtp^=' .. getcwd() .. '/Xnocdir'
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002469
2470 var lines =<< trim END
2471 vim9script
2472 export def Func(): string
2473 return 'called'
2474 enddef
2475 g:double_loaded = 'yes'
2476 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002477 writefile(lines, 'Xnocdir/autoload/double.vim')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002478
2479 lines =<< trim END
2480 vim9script noclear
2481 if exists('g:script_loaded')
2482 finish
2483 endif
2484 g:script_loaded = true
2485
2486 import autoload 'double.vim'
2487 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
2488 END
2489 g:double_loaded = 'no'
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002490 writefile(lines, 'Xloaddouble', 'D')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002491 source Xloaddouble
2492 assert_equal('no', g:double_loaded)
2493 assert_equal(true, g:script_loaded)
2494 source Xloaddouble
2495 feedkeys("\<F3>", 'xt')
2496 assert_equal('called', g:result)
2497 assert_equal('yes', g:double_loaded)
2498
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002499 unlet g:double_loaded
2500 unlet g:script_loaded
2501 unlet g:result
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002502 &rtp = save_rtp
2503enddef
2504
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002505def Test_vim9script_autoload_duplicate()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002506 mkdir('Xdupdir/autoload', 'pR')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002507
2508 var lines =<< trim END
2509 vim9script
2510
2511 export def Func()
2512 enddef
2513
2514 def Func()
2515 enddef
2516 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002517 writefile(lines, 'Xdupdir/autoload/dupfunc.vim')
2518 assert_fails('source Xdupdir/autoload/dupfunc.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002519
2520 lines =<< trim END
2521 vim9script
2522
2523 def Func()
2524 enddef
2525
2526 export def Func()
2527 enddef
2528 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002529 writefile(lines, 'Xdupdir/autoload/dup2func.vim')
2530 assert_fails('source Xdupdir/autoload/dup2func.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002531
2532 lines =<< trim END
2533 vim9script
2534
2535 def Func()
2536 enddef
2537
2538 export var Func = 'asdf'
2539 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002540 writefile(lines, 'Xdupdir/autoload/dup3func.vim')
2541 assert_fails('source Xdupdir/autoload/dup3func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002542
2543 lines =<< trim END
2544 vim9script
2545
2546 export var Func = 'asdf'
2547
2548 def Func()
2549 enddef
2550 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002551 writefile(lines, 'Xdupdir/autoload/dup4func.vim')
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01002552 assert_fails('source Xdupdir/autoload/dup4func.vim', 'E1041:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002553
2554 lines =<< trim END
2555 vim9script
2556
2557 var Func = 'asdf'
2558
2559 export def Func()
2560 enddef
2561 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002562 writefile(lines, 'Xdupdir/autoload/dup5func.vim')
2563 assert_fails('source Xdupdir/autoload/dup5func.vim', 'E707:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002564
2565 lines =<< trim END
2566 vim9script
2567
2568 export def Func()
2569 enddef
2570
2571 var Func = 'asdf'
2572 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002573 writefile(lines, 'Xdupdir/autoload/dup6func.vim')
2574 assert_fails('source Xdupdir/autoload/dup6func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002575enddef
2576
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002577def Test_autoload_missing_function_name()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002578 mkdir('Xmisdir/autoload', 'pR')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002579
2580 var lines =<< trim END
2581 vim9script
2582
2583 def loadme#()
2584 enddef
2585 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002586 writefile(lines, 'Xmisdir/autoload/loadme.vim')
2587 assert_fails('source Xmisdir/autoload/loadme.vim', 'E129:')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002588enddef
2589
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002590def Test_autoload_name_wrong()
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002591 var lines =<< trim END
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002592 def Xscriptname#Func()
2593 enddef
2594 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002595 writefile(lines, 'Xscriptname.vim', 'D')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002596 v9.CheckScriptFailure(lines, 'E746:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002597
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002598 mkdir('Xwrodir/autoload', 'pR')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002599 lines =<< trim END
2600 vim9script
2601 def somescript#Func()
2602 enddef
2603 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002604 writefile(lines, 'Xwrodir/autoload/somescript.vim')
2605 assert_fails('source Xwrodir/autoload/somescript.vim', 'E1263:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002606
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002607 delete('Xwrodir', 'rf')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002608enddef
2609
Bram Moolenaard041f422022-01-12 19:54:00 +00002610def Test_import_autoload_postponed()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002611 mkdir('Xpostdir/autoload', 'pR')
Bram Moolenaard041f422022-01-12 19:54:00 +00002612 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002613 exe 'set rtp^=' .. getcwd() .. '/Xpostdir'
Bram Moolenaard041f422022-01-12 19:54:00 +00002614
2615 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002616 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00002617
2618 g:loaded_postponed = 'true'
2619 export var variable = 'bla'
2620 export def Function(): string
2621 return 'bla'
2622 enddef
2623 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002624 writefile(lines, 'Xpostdir/autoload/postponed.vim')
Bram Moolenaard041f422022-01-12 19:54:00 +00002625
2626 lines =<< trim END
2627 vim9script
2628
2629 import autoload 'postponed.vim'
2630 def Tryit()
2631 echo postponed.variable
2632 echo postponed.Function()
2633 enddef
2634 defcompile
2635 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002636 v9.CheckScriptSuccess(lines)
Bram Moolenaard041f422022-01-12 19:54:00 +00002637 assert_false(exists('g:loaded_postponed'))
Bram Moolenaar62aec932022-01-29 21:45:34 +00002638 v9.CheckScriptSuccess(lines + ['Tryit()'])
Bram Moolenaard041f422022-01-12 19:54:00 +00002639 assert_equal('true', g:loaded_postponed)
2640
2641 unlet g:loaded_postponed
Bram Moolenaard041f422022-01-12 19:54:00 +00002642 &rtp = save_rtp
2643enddef
2644
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002645def Test_import_autoload_override()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002646 mkdir('Xoverdir/autoload', 'pR')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002647 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002648 exe 'set rtp^=' .. getcwd() .. '/Xoverdir'
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002649 test_override('autoload', 1)
2650
2651 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002652 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002653
2654 g:loaded_override = 'true'
2655 export var variable = 'bla'
2656 export def Function(): string
2657 return 'bla'
2658 enddef
2659 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002660 writefile(lines, 'Xoverdir/autoload/override.vim')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002661
2662 lines =<< trim END
2663 vim9script
2664
2665 import autoload 'override.vim'
2666 assert_equal('true', g:loaded_override)
2667
2668 def Tryit()
2669 echo override.doesNotExist
2670 enddef
2671 defcompile
2672 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002673 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002674
2675 test_override('autoload', 0)
2676 unlet g:loaded_override
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002677 &rtp = save_rtp
2678enddef
2679
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002680def Test_autoload_mapping()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002681 mkdir('Xmapdir/autoload', 'pR')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002682 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002683 exe 'set rtp^=' .. getcwd() .. '/Xmapdir'
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002684
2685 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002686 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002687
2688 g:toggle_loaded = 'yes'
2689
2690 export def Toggle(): string
2691 return ":g:toggle_called = 'yes'\<CR>"
2692 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002693 export def Doit()
2694 g:doit_called = 'yes'
2695 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002696 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002697 writefile(lines, 'Xmapdir/autoload/toggle.vim')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002698
2699 lines =<< trim END
2700 vim9script
2701
2702 import autoload 'toggle.vim'
2703
Bram Moolenaar94722c52023-01-28 19:19:03 +00002704 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002705 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2706 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002707 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002708 v9.CheckScriptSuccess(lines)
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002709 assert_false(exists("g:toggle_loaded"))
2710 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002711 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002712
2713 feedkeys("tt", 'xt')
2714 assert_equal('yes', g:toggle_loaded)
2715 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002716 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002717
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002718 feedkeys("xx", 'xt')
2719 assert_equal('yes', g:doit_called)
2720
2721 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2722
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002723 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002724 nunmap xx
2725 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002726 unlet g:toggle_loaded
2727 unlet g:toggle_called
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002728 &rtp = save_rtp
2729enddef
2730
Bram Moolenaar160aa862022-01-10 21:29:57 +00002731def Test_vim9script_autoload_fails()
2732 var lines =<< trim END
2733 vim9script autoload
2734 var n = 0
2735 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002736 v9.CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002737
2738 lines =<< trim END
2739 vim9script noclear noclear
2740 var n = 0
2741 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002742 v9.CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01002743
2744 lines =<< trim END
2745 vim9script noclears
2746 var n = 0
2747 END
2748 v9.CheckScriptFailure(lines, 'E475: Invalid argument: noclears')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002749enddef
2750
2751def Test_import_autoload_fails()
2752 var lines =<< trim END
2753 vim9script
2754 import autoload autoload 'prefixed.vim'
2755 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002756 v9.CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002757
2758 lines =<< trim END
2759 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002760 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002761 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002762 v9.CheckScriptFailure(lines, 'E282:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002763
2764 lines =<< trim END
2765 vim9script
2766 import autoload '/dir/doesNotExist.vim'
2767 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002768 v9.CheckScriptFailure(lines, 'E282:', 2)
2769
2770 lines =<< trim END
2771 vim9script
2772 import autoload '../testdir'
2773 END
2774 v9.CheckScriptFailure(lines, 'E17:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002775
2776 lines =<< trim END
2777 vim9script
2778 import autoload 'doesNotExist.vim'
2779 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002780 v9.CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002781enddef
2782
2783" test disassembling an auto-loaded function starting with "debug"
2784def Test_vim9_autoload_disass()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002785 mkdir('Xdasdir/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002786 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002787 exe 'set rtp^=' .. getcwd() .. '/Xdasdir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002788
2789 var lines =<< trim END
2790 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002791 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002792 return 'debug'
2793 enddef
2794 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002795 writefile(lines, 'Xdasdir/autoload/debugit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002796
2797 lines =<< trim END
2798 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002799 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002800 return 'profile'
2801 enddef
2802 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002803 writefile(lines, 'Xdasdir/autoload/profileit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002804
2805 lines =<< trim END
2806 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002807 assert_equal('debug', debugit#Test())
2808 disass debugit#Test
2809 assert_equal('profile', profileit#Test())
2810 disass profileit#Test
Bram Moolenaar160aa862022-01-10 21:29:57 +00002811 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002812 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002813
Bram Moolenaar160aa862022-01-10 21:29:57 +00002814 &rtp = save_rtp
2815enddef
2816
2817" test using a vim9script that is auto-loaded from an autocmd
2818def Test_vim9_aucmd_autoload()
2819 var lines =<< trim END
2820 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002821 export def Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002822 echomsg getreg('"')
2823 enddef
2824 END
2825
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002826 mkdir('Xauldir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002827 writefile(lines, 'Xauldir/autoload/foo.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002828 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002829 exe 'set rtp^=' .. getcwd() .. '/Xauldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002830 augroup test
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002831 autocmd TextYankPost * call foo#Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002832 augroup END
2833
2834 normal Y
2835
2836 augroup test
2837 autocmd!
2838 augroup END
Bram Moolenaar160aa862022-01-10 21:29:57 +00002839 &rtp = save_rtp
2840enddef
2841
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002842" test using a autoloaded file that is case sensitive
2843def Test_vim9_autoload_case_sensitive()
2844 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002845 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002846 export def CaseSensitive(): string
2847 return 'done'
2848 enddef
2849 END
2850
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002851 mkdir('Xcasedir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002852 writefile(lines, 'Xcasedir/autoload/CaseSensitive.vim')
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002853 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002854 exe 'set rtp^=' .. getcwd() .. '/Xcasedir'
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002855
2856 lines =<< trim END
2857 vim9script
2858 import autoload 'CaseSensitive.vim'
2859 assert_equal('done', CaseSensitive.CaseSensitive())
2860 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002861 v9.CheckScriptSuccess(lines)
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002862
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002863 if !has('fname_case')
2864 lines =<< trim END
2865 vim9script
2866 import autoload 'CaseSensitive.vim'
2867 import autoload 'casesensitive.vim'
2868 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002869 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002870 endif
2871
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002872 &rtp = save_rtp
2873enddef
2874
Bram Moolenaar160aa862022-01-10 21:29:57 +00002875" This was causing a crash because suppress_errthrow wasn't reset.
2876def Test_vim9_autoload_error()
2877 var lines =<< trim END
2878 vim9script
2879 def crash#func()
2880 try
2881 for x in List()
2882 endfor
2883 catch
2884 endtry
2885 g:ok = true
2886 enddef
2887 fu List()
2888 invalid
2889 endfu
2890 try
2891 alsoinvalid
2892 catch /wontmatch/
2893 endtry
2894 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002895 call mkdir('Xruntime/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002896 call writefile(lines, 'Xruntime/autoload/crash.vim')
2897
2898 # run in a separate Vim to avoid the side effects of assert_fails()
2899 lines =<< trim END
2900 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
2901 call crash#func()
2902 call writefile(['ok'], 'Xdidit')
2903 qall!
2904 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002905 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002906 g:RunVim([], [], '-S Xscript')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002907 assert_equal(['ok'], readfile('Xdidit'))
2908
2909 delete('Xdidit')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002910
2911 lines =<< trim END
2912 vim9script
2913 var foo#bar = 'asdf'
2914 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002915 v9.CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002916enddef
2917
Bram Moolenaar753885b2022-08-24 16:30:36 +01002918def Test_vim9_import_symlink()
2919 if !has('unix')
2920 CheckUnix
2921 else
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002922 mkdir('Xto/plugin', 'pR')
Bram Moolenaar753885b2022-08-24 16:30:36 +01002923 var lines =<< trim END
2924 vim9script
2925 import autoload 'bar.vim'
2926 g:resultFunc = bar.Func()
2927 g:resultValue = bar.value
2928 END
2929 writefile(lines, 'Xto/plugin/foo.vim')
2930
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002931 mkdir('Xto/autoload', 'pR')
Bram Moolenaar753885b2022-08-24 16:30:36 +01002932 lines =<< trim END
2933 vim9script
2934 export def Func(): string
2935 return 'func'
2936 enddef
2937 export var value = 'val'
2938 END
2939 writefile(lines, 'Xto/autoload/bar.vim')
2940
2941 var save_rtp = &rtp
2942 &rtp = getcwd() .. '/Xfrom'
2943 system('ln -s ' .. getcwd() .. '/Xto Xfrom')
2944
2945 source Xfrom/plugin/foo.vim
2946 assert_equal('func', g:resultFunc)
2947 assert_equal('val', g:resultValue)
2948
2949 var infoTo = getscriptinfo()->filter((_, v) => v.name =~ 'Xto/autoload/bar')
2950 var infoFrom = getscriptinfo()->filter((_, v) => v.name =~ 'Xfrom/autoload/bar')
2951 assert_equal(1, len(infoTo))
2952 assert_equal(1, len(infoFrom))
2953 assert_equal(infoTo[0].sid, infoFrom[0].sourced)
Bram Moolenaar7ea9fcb2022-08-24 17:46:12 +01002954 var output: string
2955 redir => output
2956 scriptnames
2957 redir END
2958 assert_match(infoFrom[0].sid .. '->' .. infoFrom[0].sourced .. '.*Xfrom', output)
Bram Moolenaar753885b2022-08-24 16:30:36 +01002959
2960 unlet g:resultFunc
2961 unlet g:resultValue
2962 &rtp = save_rtp
Bram Moolenaar753885b2022-08-24 16:30:36 +01002963 delete('Xfrom', 'rf')
Ernie Rael9a901792024-04-16 22:11:56 +02002964
2965 # Access item from :def imported through symbolic linked directory. #14536
2966 mkdir('Xto/real_dir', 'pR')
2967 lines =<< trim END
2968 vim9script
2969 export const val = 17
2970 export def F(): number
2971 return 23
2972 enddef
2973 END
2974 writefile(lines, 'Xto/real_dir/real_file.vim')
2975 system('ln -s real_dir Xto/syml_dir')
2976 defer delete('Xto/syml_dir')
2977 lines =<< trim END
2978 vim9script
2979 import autoload './Xto/syml_dir/real_file.vim'
2980
2981 def Fmain()
2982 assert_equal(17, real_file.val)
2983 enddef
2984 def F2()
2985 assert_equal(23, real_file.F())
2986 enddef
2987 Fmain()
2988 F2()
2989 END
2990 v9.CheckScriptSuccess(lines)
Bram Moolenaar753885b2022-08-24 16:30:36 +01002991 endif
2992enddef
2993
LemonBoy90c27b22023-08-27 19:28:15 +02002994def Test_export_in_conditional_block()
2995 var lines =<< trim END
2996 vim9script
2997 if exists('this_will_fail')
2998 export var MyVar = "hello"
2999 endif
3000 END
3001 v9.CheckScriptSuccess(lines)
3002enddef
3003
Yegappan Lakshmananfa630082024-03-10 19:22:38 +01003004" Import fails when an autoloaded script is imported again.
3005" Github issue #14171
3006def Test_import_autloaded_script()
3007 mkdir('Ximporttwice', 'pR')
3008 mkdir('Ximporttwice/plugin')
3009 mkdir('Ximporttwice/autoload')
3010 var save_rtp = &rtp
3011 exe 'set rtp^=' .. getcwd() .. '/Ximporttwice'
3012
3013 var lines =<< trim END
3014 vim9script
3015
3016 export def H(): number
3017 return 10
3018 enddef
3019 END
3020 writefile(lines, 'Ximporttwice/autoload/hello.vim')
3021
3022 lines =<< trim END
3023 vim9script
3024
3025 import "./hello.vim"
3026 export def W(): number
3027 return 20
3028 enddef
3029 END
3030 writefile(lines, 'Ximporttwice/autoload/world.vim')
3031
3032 lines =<< trim END
3033 vim9script
3034
3035 import autoload '../autoload/hello.vim'
3036 import autoload '../autoload/world.vim'
3037
3038 command Hello echo hello.H()
3039 command World echo world.W()
3040 END
3041 writefile(lines, 'Ximporttwice/plugin/main.vim')
3042
3043 lines =<< trim END
3044 vim9script
3045
3046 source ./Ximporttwice/plugin/main.vim
3047 assert_equal(['20'], execute('World')->split("\n"))
3048 END
3049 v9.CheckScriptSuccess(lines)
3050
3051 &rtp = save_rtp
3052enddef
Bram Moolenaard8448622022-01-07 21:39:52 +00003053
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02003054" Test for autoloading an imported dict func
3055def Test_autoload_import_dict_func()
3056 mkdir('Xdir/autoload', 'pR')
3057 var lines =<< trim END
3058 vim9script
3059 export var al_exported_nr: number = 33
3060 def Al_AddNum(n: number)
3061 al_exported_nr += n
3062 enddef
3063 export var al_exportedDict: dict<func> = {Fn: Al_AddNum}
3064 END
3065 writefile(lines, 'Xdir/autoload/Xdictfunc.vim')
3066
3067 var save_rtp = &rtp
3068 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3069 lines =<< trim END
3070 import './Xdir/autoload/Xdictfunc.vim'
3071 call Xdictfunc#al_exportedDict.Fn(5)
3072 call assert_equal(38, Xdictfunc#al_exported_nr)
3073 call call(Xdictfunc#al_exportedDict.Fn, [3])
3074 call assert_equal(41, Xdictfunc#al_exported_nr)
3075 END
3076 v9.CheckScriptSuccess(lines)
3077 &rtp = save_rtp
3078enddef
3079
Bram Moolenaard8448622022-01-07 21:39:52 +00003080" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker