blob: 1c8136a0db32a7b6dceb533f2f5eb31be299653b [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()
John Marriott45377e22025-03-27 18:12:32 +0100660 CheckFeature quickfix
Bram Moolenaard8448622022-01-07 21:39:52 +0000661 # check that :import works when the buffer is locked
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100662 mkdir('ftplugin', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +0000663 var export_lines =<< trim END
664 vim9script
665 export var That = 'yes'
666 END
667 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
668
669 var import_lines =<< trim END
670 vim9script
671 import './Xexport_ft.vim' as ft
672 assert_equal('yes', ft.That)
673 g:did_load_mytpe = 1
674 END
675 writefile(import_lines, 'ftplugin/qf.vim')
676
677 var save_rtp = &rtp
678 &rtp = getcwd() .. ',' .. &rtp
679
680 filetype plugin on
681 copen
682 assert_equal(1, g:did_load_mytpe)
683
684 quit!
Bram Moolenaard8448622022-01-07 21:39:52 +0000685 &rtp = save_rtp
686enddef
687
688def Test_use_import_in_mapping()
689 var lines =<< trim END
690 vim9script
Bram Moolenaar89445512022-04-14 12:58:23 +0100691 export def Funcx(nr: number)
692 g:result = nr
Bram Moolenaard8448622022-01-07 21:39:52 +0000693 enddef
694 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100695 writefile(lines, 'XsomeExport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000696 lines =<< trim END
697 vim9script
698 import './XsomeExport.vim' as some
699 var Funcy = some.Funcx
Bram Moolenaar89445512022-04-14 12:58:23 +0100700 nnoremap <F3> :call <sid>Funcy(42)<cr>
701 nnoremap <F4> :call <sid>some.Funcx(44)<cr>
Bram Moolenaard8448622022-01-07 21:39:52 +0000702 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100703 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000704
705 source Xmapscript.vim
706 feedkeys("\<F3>", "xt")
707 assert_equal(42, g:result)
Bram Moolenaar89445512022-04-14 12:58:23 +0100708 feedkeys("\<F4>", "xt")
709 assert_equal(44, g:result)
Bram Moolenaard8448622022-01-07 21:39:52 +0000710
711 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +0000712 nunmap <F3>
Bram Moolenaar89445512022-04-14 12:58:23 +0100713 nunmap <F4>
714enddef
715
Bram Moolenaar648dd882022-04-14 21:36:15 +0100716def Test_use_relative_autoload_import_in_mapping()
Bram Moolenaar89445512022-04-14 12:58:23 +0100717 var lines =<< trim END
718 vim9script
719 export def Func()
720 g:result = 42
721 enddef
722 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100723 writefile(lines, 'XrelautoloadExport.vim', 'D')
Bram Moolenaar89445512022-04-14 12:58:23 +0100724 lines =<< trim END
725 vim9script
Bram Moolenaar648dd882022-04-14 21:36:15 +0100726 import autoload './XrelautoloadExport.vim' as some
Bram Moolenaar89445512022-04-14 12:58:23 +0100727 nnoremap <F3> :call <SID>some.Func()<CR>
728 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100729 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaar89445512022-04-14 12:58:23 +0100730
731 source Xmapscript.vim
Bram Moolenaar648dd882022-04-14 21:36:15 +0100732 assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100733 var l = getscriptinfo()
734 assert_match('XrelautoloadExport.vim$', l[-1].name)
735 assert_true(l[-1].autoload)
Bram Moolenaar89445512022-04-14 12:58:23 +0100736 feedkeys("\<F3>", "xt")
737 assert_equal(42, g:result)
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100738 l = getscriptinfo({name: 'XrelautoloadExport'})
739 assert_true(len(l) == 1)
740 assert_match('XrelautoloadExport.vim$', l[0].name)
741 assert_false(l[0].autoload)
Yegappan Lakshmanan2f892d82022-08-28 18:52:10 +0100742 assert_equal(999999, l[0].version)
Bram Moolenaar89445512022-04-14 12:58:23 +0100743
744 unlet g:result
Bram Moolenaar89445512022-04-14 12:58:23 +0100745 nunmap <F3>
Bram Moolenaard8448622022-01-07 21:39:52 +0000746enddef
747
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100748def Test_autoload_import_var()
749 # variable name starts with "autoload"
750 var lines =<< trim END
751 vim9script
752 var autoloaded = "Xtest.vim"
753 import autoloaded
754 END
755 v9.CheckScriptFailure(lines, 'E1053: Could not import "Xtest.vim')
756enddef
757
Bram Moolenaar648dd882022-04-14 21:36:15 +0100758def Test_use_autoload_import_in_mapping()
759 var lines =<< trim END
760 vim9script
761 export def Func()
762 g:result = 49
763 enddef
764 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100765 mkdir('Ximpdir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100766 writefile(lines, 'Ximpdir/autoload/XautoloadExport.vim')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100767 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100768 exe 'set rtp^=' .. getcwd() .. '/Ximpdir'
Bram Moolenaar648dd882022-04-14 21:36:15 +0100769
770 lines =<< trim END
771 vim9script
772 import autoload 'XautoloadExport.vim' as some
773 nnoremap <F3> :call <SID>some.Func()<CR>
774 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100775 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100776
777 source Xmapscript.vim
778 assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
779 feedkeys("\<F3>", "xt")
780 assert_equal(49, g:result)
781
782 unlet g:result
Bram Moolenaar648dd882022-04-14 21:36:15 +0100783 nunmap <F3>
Bram Moolenaar648dd882022-04-14 21:36:15 +0100784 &rtp = save_rtp
785enddef
786
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000787def Test_use_import_in_command_completion()
Bram Moolenaar15d16352022-01-17 20:09:08 +0000788 var lines =<< trim END
789 vim9script
790 export def Complete(..._): list<string>
791 return ['abcd']
792 enddef
793 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100794 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar15d16352022-01-17 20:09:08 +0000795
796 lines =<< trim END
797 vim9script
798 import './Xscript.vim'
799
800 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
801 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
802 assert_equal('#Cmd abcd', @:)
803 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000804 v9.CheckScriptSuccess(lines)
Bram Moolenaar15d16352022-01-17 20:09:08 +0000805
806 delcommand Cmd
Bram Moolenaar15d16352022-01-17 20:09:08 +0000807enddef
808
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100809def Test_use_import_with_funcref_in_command_completion()
810 var lines =<< trim END
811 vim9script
812 export def Complete(..._): list<string>
813 return ['abcd']
814 enddef
815 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100816 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100817
818 lines =<< trim END
819 vim9script
820 import './Xscript.vim'
821
822 var Ref = Xscript.Complete
823 exe "command -nargs=1 -complete=customlist," .. expand('<SID>') .. "Ref Cmd echo 'ok'"
824 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
825 assert_equal('#Cmd abcd', @:)
826 END
827 v9.CheckScriptSuccess(lines)
828
829 delcommand Cmd
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100830enddef
831
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000832def Test_use_autoload_import_in_insert_completion()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100833 mkdir('Xinsdir/autoload', 'pR')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000834 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100835 exe 'set rtp^=' .. getcwd() .. '/Xinsdir'
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000836
837 var lines =<< trim END
838 vim9script
839 export def ThesaurusFunc(findbase: bool, _): any
840 if findbase
841 return 1
842 endif
843 return [
844 'check',
845 'experiment',
846 'test',
847 'verification'
848 ]
849 enddef
850 g:completion_loaded = 'yes'
851 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100852 writefile(lines, 'Xinsdir/autoload/completion.vim')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000853
854 new
855 lines =<< trim END
856 vim9script
857 g:completion_loaded = 'no'
858 import autoload 'completion.vim'
859 set thesaurusfunc=completion.ThesaurusFunc
860 assert_equal('no', g:completion_loaded)
861 feedkeys("i\<C-X>\<C-T>\<C-N>\<Esc>", 'xt')
862 assert_equal('experiment', getline(1))
863 assert_equal('yes', g:completion_loaded)
864 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000865 v9.CheckScriptSuccess(lines)
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000866
867 set thesaurusfunc=
868 bwipe!
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000869 &rtp = save_rtp
870enddef
871
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000872def Test_use_autoload_import_partial_in_opfunc()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100873 mkdir('Xpartdir/autoload', 'pR')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000874 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100875 exe 'set rtp^=' .. getcwd() .. '/Xpartdir'
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000876
877 var lines =<< trim END
878 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100879 export def Opfunc1(..._)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000880 g:opfunc_called = 'yes'
881 enddef
882 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100883 writefile(lines, 'Xpartdir/autoload/opfunc.vim')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000884
885 new
886 lines =<< trim END
887 vim9script
888 import autoload 'opfunc.vim'
889 nnoremap <expr> <F3> TheFunc()
890 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100891 &operatorfunc = function('opfunc.Opfunc1', [0])
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000892 return 'g@'
893 enddef
894 feedkeys("\<F3>l", 'xt')
895 assert_equal('yes', g:opfunc_called)
896 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000897 v9.CheckScriptSuccess(lines)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000898
899 set opfunc=
900 bwipe!
Bram Moolenaar06b77222022-01-25 15:51:56 +0000901 nunmap <F3>
902 &rtp = save_rtp
903enddef
904
905def Test_set_opfunc_to_autoload_func_directly()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100906 mkdir('Xdirdir/autoload', 'pR')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000907 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100908 exe 'set rtp^=' .. getcwd() .. '/Xdirdir'
Bram Moolenaar06b77222022-01-25 15:51:56 +0000909
910 var lines =<< trim END
911 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100912 export def Opfunc2(..._)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000913 g:opfunc_called = 'yes'
914 enddef
915 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100916 writefile(lines, 'Xdirdir/autoload/opfunc.vim')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000917
918 new
919 lines =<< trim END
920 vim9script
921 import autoload 'opfunc.vim'
922 nnoremap <expr> <F3> TheFunc()
923 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100924 &operatorfunc = opfunc.Opfunc2
Bram Moolenaar06b77222022-01-25 15:51:56 +0000925 return 'g@'
926 enddef
927 feedkeys("\<F3>l", 'xt')
928 assert_equal('yes', g:opfunc_called)
929 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000930 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000931
932 set opfunc=
933 bwipe!
Bram Moolenaar06b77222022-01-25 15:51:56 +0000934 nunmap <F3>
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000935 &rtp = save_rtp
936enddef
937
Bram Moolenaare70dd112022-01-21 16:31:11 +0000938def Test_use_autoload_import_in_fold_expression()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100939 mkdir('Xfolddir/autoload', 'pR')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000940 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100941 exe 'set rtp^=' .. getcwd() .. '/Xfolddir'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000942
943 var lines =<< trim END
944 vim9script
945 export def Expr(): string
946 return getline(v:lnum) =~ '^#' ? '>1' : '1'
947 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000948 export def Text(): string
949 return 'fold text'
950 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000951 g:fold_loaded = 'yes'
952 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100953 writefile(lines, 'Xfolddir/autoload/fold.vim')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000954
955 lines =<< trim END
956 vim9script
957 import autoload 'fold.vim'
958 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000959 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000960 &foldmethod = 'expr'
961 &debug = 'throw'
962 END
963 new
964 setline(1, ['# one', 'text', '# two', 'text'])
965 g:fold_loaded = 'no'
Bram Moolenaar62aec932022-01-29 21:45:34 +0000966 v9.CheckScriptSuccess(lines)
Bram Moolenaare70dd112022-01-21 16:31:11 +0000967 assert_equal('no', g:fold_loaded)
968 redraw
969 assert_equal('yes', g:fold_loaded)
970
971 # Check that script context of 'foldexpr' is copied to another buffer.
972 edit! otherfile
973 redraw
974
Bram Moolenaar9530b582022-01-22 13:39:08 +0000975 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +0000976 bwipe!
Bram Moolenaare70dd112022-01-21 16:31:11 +0000977 &rtp = save_rtp
978enddef
979
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100980def Test_autoload_import_relative()
981 var lines =<< trim END
982 vim9script
983
984 g:loaded = 'yes'
985 export def RelFunc(): string
986 return 'relfunc'
987 enddef
988 def NotExported()
989 echo 'not'
990 enddef
991
992 export var someText = 'some text'
993 var notexp = 'bad'
994 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100995 writefile(lines, 'XimportRel.vim', 'D')
996 writefile(lines, 'XimportRel2.vim', 'D')
997 writefile(lines, 'XimportRel3.vim', 'D')
998 writefile(lines, 'XimportRel4.vim', 'D')
999 writefile(lines, 'XimportRel5.vim', 'D')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001000
1001 lines =<< trim END
1002 vim9script
1003 g:loaded = 'no'
1004 import autoload './XimportRel.vim'
1005 assert_equal('no', g:loaded)
1006
1007 def AFunc(): string
1008 var res = ''
1009 res ..= XimportRel.RelFunc()
1010 res ..= '/'
1011 res ..= XimportRel.someText
1012 XimportRel.someText = 'from AFunc'
1013 return res
1014 enddef
1015 # script not loaded when compiling
1016 defcompile
1017 assert_equal('no', g:loaded)
1018
1019 assert_equal('relfunc/some text', AFunc())
1020 assert_equal('yes', g:loaded)
1021 unlet g:loaded
1022
1023 assert_equal('from AFunc', XimportRel.someText)
1024 XimportRel.someText = 'from script'
1025 assert_equal('from script', XimportRel.someText)
1026 END
1027 v9.CheckScriptSuccess(lines)
1028
1029 lines =<< trim END
1030 vim9script
1031 import autoload './XimportRel.vim'
1032 echo XimportRel.NotExported()
1033 END
1034 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 3)
1035
1036 lines =<< trim END
1037 vim9script
1038 import autoload './XimportRel.vim'
1039 echo XimportRel.notexp
1040 END
1041 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1042
1043 lines =<< trim END
1044 vim9script
1045 import autoload './XimportRel.vim'
1046 XimportRel.notexp = 'bad'
1047 END
1048 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1049
1050 lines =<< trim END
1051 vim9script
1052 import autoload './XimportRel.vim'
1053 def Func()
1054 echo XimportRel.NotExported()
1055 enddef
1056 Func()
1057 END
1058 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 1)
1059
1060 lines =<< trim END
1061 vim9script
1062 import autoload './XimportRel.vim'
1063 def Func()
1064 echo XimportRel.notexp
1065 enddef
1066 Func()
1067 END
1068 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1069
Bram Moolenaar10611952022-04-03 21:11:34 +01001070 # Same, script not imported before
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001071 lines =<< trim END
1072 vim9script
Bram Moolenaar10611952022-04-03 21:11:34 +01001073 import autoload './XimportRel4.vim'
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001074 def Func()
Bram Moolenaar10611952022-04-03 21:11:34 +01001075 echo XimportRel4.notexp
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001076 enddef
1077 Func()
1078 END
1079 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1080
Bram Moolenaar10611952022-04-03 21:11:34 +01001081 # does not fail if the script wasn't loaded yet and only compiling
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001082 g:loaded = 'no'
1083 lines =<< trim END
1084 vim9script
1085 import autoload './XimportRel2.vim'
1086 def Func()
1087 echo XimportRel2.notexp
1088 enddef
1089 defcompile
1090 END
1091 v9.CheckScriptSuccess(lines)
1092 assert_equal('no', g:loaded)
1093
Bram Moolenaar10611952022-04-03 21:11:34 +01001094 lines =<< trim END
1095 vim9script
1096 import autoload './XimportRel.vim'
1097 def Func()
1098 XimportRel.notexp = 'bad'
1099 enddef
1100 Func()
1101 END
1102 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1103
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001104 # fails with a not loaded import
1105 lines =<< trim END
1106 vim9script
1107 import autoload './XimportRel3.vim'
1108 def Func()
1109 XimportRel3.notexp = 'bad'
1110 enddef
1111 Func()
1112 END
1113 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1114 assert_equal('yes', g:loaded)
1115 unlet g:loaded
1116
Bram Moolenaar10611952022-04-03 21:11:34 +01001117 lines =<< trim END
1118 vim9script
1119 import autoload './XimportRel5.vim'
1120 def Func()
1121 XimportRel5.nosuchvar = 'bad'
1122 enddef
1123 Func()
1124 END
1125 v9.CheckScriptFailure(lines, 'E121: Undefined variable: nosuchvar', 1)
1126 unlet g:loaded
1127
1128 # nasty: delete script after compiling function
1129 writefile(['vim9script'], 'XimportRelDel.vim')
1130 lines =<< trim END
1131 vim9script
1132
1133 import autoload './XimportRelDel.vim'
1134 def DoIt()
1135 echo XimportRelDel.var
1136 enddef
1137 defcompile
1138 delete('XimportRelDel.vim')
1139 DoIt()
1140 END
Bram Moolenaar242c1522022-04-03 21:52:51 +01001141 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001142enddef
1143
Yegappan Lakshmananf135fa22024-04-20 18:31:21 +02001144" autoload relative, access from compiled function.
1145" Github issues: #14565, #14579
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001146def Test_autoload_import_relative_compiled_buffer()
Ernie Rael1433ac92024-04-17 22:36:32 +02001147 var lines =<< trim END
1148 vim9script
1149
1150 export def F1(): string
1151 return 'InFile.vim'
1152 enddef
1153 END
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001154 writefile(lines, 'Ximportrelativebuffer.vim', 'D')
Ernie Rael1433ac92024-04-17 22:36:32 +02001155 lines =<< trim END
1156 vim9script
1157
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001158 import autoload './Ximportrelativebuffer.vim' as xfile
Ernie Rael1433ac92024-04-17 22:36:32 +02001159
1160 def F(): string
1161 return xfile.F1()
1162 enddef
1163 assert_equal('InFile.vim', F())
1164 END
1165 new
1166 setline(1, lines)
1167 :source
Yegappan Lakshmananf135fa22024-04-20 18:31:21 +02001168 # source one more time to detect issues with clearing the script state and
1169 # variables
1170 :source
1171 :bw!
1172enddef
1173
1174" Test for relative import when sourcing a buffer in another directory
1175def Test_autoload_import_relative_from_buffer_in_dir()
1176 mkdir('Ximportrelative/dir1/dir2', 'pR')
1177 var lines =<< trim END
1178 vim9script
1179
1180 export def F1(): string
1181 return 'InFile.vim'
1182 enddef
1183 END
1184 writefile(lines, 'Ximportrelative/dir1/dir2/Ximport.vim')
1185 lines =<< trim END
1186 vim9script
1187
1188 import autoload './Ximport.vim' as xfile
1189
1190 def F(): string
1191 return xfile.F1()
1192 enddef
1193 assert_equal('InFile.vim', F())
1194 END
1195 writefile(lines, 'Ximportrelative/dir1/dir2/Xrelative.vim')
1196
1197 split Ximportrelative/dir1/dir2/Xrelative.vim
1198 :source
1199 # source one more time to detect issues with clearing the script state and
1200 # variables
1201 :source
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001202 :bw!
Ernie Rael1433ac92024-04-17 22:36:32 +02001203enddef
1204
Ernie Rael84f6dc72024-04-21 14:45:48 +02001205" Test modifying exported autoload variable. Github issue: #14591
1206def Test_autoload_export_variables()
1207 mkdir('Xautoload_vars/autoload', 'pR')
1208 var lines =<< trim END
1209 vim9script
Ernie Rael3f821d62024-04-24 20:07:50 +02001210 g:Xautoload_vars_autoload = true
Ernie Rael84f6dc72024-04-21 14:45:48 +02001211 export var val = 11
1212 val = 42
1213 END
1214
1215 # Test that the imported script, above, can modify the exported variable;
1216 # and test that the importing script, below, can modify the variable.
1217 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f2.vim', 'D')
1218 lines =<< trim END
1219 vim9script
Ernie Rael3f821d62024-04-24 20:07:50 +02001220 g:Xautoload_vars_autoload = false
Ernie Rael84f6dc72024-04-21 14:45:48 +02001221
1222 import autoload './Xautoload_vars/autoload/Xauto_vars_f2.vim' as f2
Ernie Rael3f821d62024-04-24 20:07:50 +02001223 # Verify that the import statement does not load the file.
1224 assert_equal(false, g:Xautoload_vars_autoload)
Ernie Rael84f6dc72024-04-21 14:45:48 +02001225
1226 def F(): number
1227 return f2.val
1228 enddef
Ernie Rael3f821d62024-04-24 20:07:50 +02001229 # Verify compile does not load the file.
1230 defcompile F
1231 assert_equal(false, g:Xautoload_vars_autoload)
1232
1233 # load the file by accessing the exported variable
Ernie Rael84f6dc72024-04-21 14:45:48 +02001234 assert_equal(42, F())
Ernie Rael3f821d62024-04-24 20:07:50 +02001235 assert_equal(true, g:Xautoload_vars_autoload)
1236 unlet g:Xautoload_vars_autoload
1237
Ernie Rael84f6dc72024-04-21 14:45:48 +02001238 assert_equal(42, f2.val)
1239 f2.val = 17
1240 assert_equal(17, f2.val)
1241
1242 def G()
1243 f2.val = 19
1244 enddef
1245 G()
1246 assert_equal(19, f2.val)
1247 END
1248 v9.CheckScriptSuccess(lines)
1249
1250 # Test const var is not modifiable.
1251 lines =<< trim END
1252 vim9script
1253 export const val = 11
1254 val = 42
1255 END
1256 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f3.vim', 'D')
1257 lines =<< trim END
1258 vim9script
1259
1260 import autoload './Xautoload_vars/autoload/Xauto_vars_f3.vim' as f3
1261
1262 var x = f3.val
1263 END
1264 v9.CheckScriptFailure(lines, 'E46:')
1265
1266 # Test const var is not modifiable from importing script.
1267 lines =<< trim END
1268 vim9script
1269 export const val = 11
1270 END
1271 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f4.vim', 'D')
1272 lines =<< trim END
1273 vim9script
1274
1275 import autoload './Xautoload_vars/autoload/Xauto_vars_f4.vim' as f4
1276
1277 f4.val = 13
1278 END
1279 v9.CheckScriptFailure(lines, 'E46:')
Ernie Rael3f821d62024-04-24 20:07:50 +02001280
1281 # Test const var is not modifiable from importing script from :def.
1282 # Github issue: #14606
1283 lines =<< trim END
1284 vim9script
1285 export const val = 11
1286 END
1287 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f5.vim', 'D')
1288 lines =<< trim END
1289 vim9script
1290
1291 import autoload './Xautoload_vars/autoload/Xauto_vars_f5.vim' as f5
1292
1293 def F()
1294 f5.val = 13
1295 enddef
1296 F()
1297 END
1298 v9.CheckScriptFailure(lines, 'E741:')
1299
1300 # Still part of Github issue: #14606
1301 lines =<< trim END
1302 vim9script
1303 export var val = 11
1304 END
1305 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f6.vim', 'D')
1306 lines =<< trim END
1307 vim9script
1308
1309 import autoload './Xautoload_vars/autoload/Xauto_vars_f6.vim' as f6
1310
1311 def F()
1312 f6.val = 13
1313 enddef
1314 F()
1315 assert_equal(13, f6.val)
1316 END
1317 v9.CheckScriptSuccess(lines)
Ernie Rael84f6dc72024-04-21 14:45:48 +02001318enddef
1319
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001320def Test_autoload_import_relative_autoload_dir()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001321 mkdir('autoload', 'pR')
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001322 var lines =<< trim END
1323 vim9script
1324 export def Bar()
1325 g:called_bar = 'yes'
1326 enddef
1327 END
1328 writefile(lines, 'autoload/script.vim')
1329
1330 lines =<< trim END
1331 vim9script
1332 import autoload './autoload/script.vim'
1333 def Foo()
1334 script.Bar()
1335 enddef
1336 Foo()
1337 assert_equal('yes', g:called_bar)
1338 END
1339 v9.CheckScriptSuccess(lines)
1340
1341 unlet g:called_bar
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001342enddef
1343
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001344def Test_autoload_import_deleted()
1345 var lines =<< trim END
1346 vim9script
1347 export const FOO = 1
1348 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001349 writefile(lines, 'Xa.vim', 'D')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001350
1351 lines =<< trim END
1352 vim9script
1353 import autoload './Xa.vim'
1354
1355 delete('Xa.vim')
1356 var x = Xa.FOO
1357 END
1358 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001359enddef
1360
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01001361def Test_autoload_import_using_const()
1362 mkdir('Xdir/autoload', 'pR')
1363 var lines =<< trim END
1364 vim9script
1365 export const FOO = 42
1366 echomsg FOO
1367 END
1368 writefile(lines, 'Xdir/autoload/exp.vim')
1369
1370 var save_rtp = &rtp
1371 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1372 lines =<< trim END
1373 vim9script
1374 import autoload 'exp.vim'
1375 assert_equal(42, exp.FOO)
1376 END
1377 v9.CheckScriptSuccess(lines)
1378 &rtp = save_rtp
1379enddef
1380
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001381func Test_import_in_diffexpr()
1382 CheckExecutable diff
1383
1384 call Run_Test_import_in_diffexpr()
1385endfunc
1386
1387def Run_Test_import_in_diffexpr()
1388 var lines =<< trim END
1389 vim9script
1390
1391 export def DiffExpr()
1392 # Prepend some text to check diff type detection
1393 writefile(['warning', ' message'], v:fname_out)
1394 silent exe '!diff ' .. v:fname_in .. ' '
1395 .. v:fname_new .. '>>' .. v:fname_out
1396 enddef
1397 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001398 writefile(lines, 'Xdiffexpr', 'D')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001399
1400 lines =<< trim END
1401 vim9script
1402 import './Xdiffexpr' as diff
1403
1404 set diffexpr=diff.DiffExpr()
1405 set diffopt=foldcolumn:0
1406 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001407 v9.CheckScriptSuccess(lines)
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001408
1409 enew!
1410 call setline(1, ['one', 'two', 'three'])
1411 diffthis
1412
1413 botright vert new
1414 call setline(1, ['one', 'two', 'three.'])
1415 diffthis
1416 # we only check if this does not cause errors
1417 redraw
1418
1419 diffoff!
Bram Moolenaar50761872022-06-26 18:01:00 +01001420 set diffexpr=
1421 set diffopt&
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001422 bwipe!
1423 bwipe!
1424enddef
1425
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001426def Test_import_in_patchexpr()
1427 var lines =<< trim END
1428 vim9script
1429 export def TPatch()
1430 call writefile(['output file'], v:fname_out)
1431 enddef
1432 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001433 writefile(lines, 'Xpatchexpr', 'D')
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001434
1435 lines =<< trim END
1436 vim9script
1437 import './Xpatchexpr' as patch
1438 set patchexpr=patch.TPatch()
1439 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001440 v9.CheckScriptSuccess(lines)
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001441
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001442 call writefile(['input file'], 'Xinput', 'D')
1443 call writefile(['diff file'], 'Xdiff', 'D')
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001444 :%bwipe!
1445 edit Xinput
1446 diffpatch Xdiff
1447 call assert_equal('output file', getline(1))
1448
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001449 set patchexpr&
1450 :%bwipe!
1451enddef
1452
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001453def Test_import_in_formatexpr()
1454 var lines =<< trim END
1455 vim9script
1456 export def MyFormatExpr(): number
1457 g:did_format = 'yes'
1458 return 0
1459 enddef
1460 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001461 writefile(lines, 'Xformatter', 'D')
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001462
1463 lines =<< trim END
1464 vim9script
1465 import './Xformatter' as format
1466 set formatexpr=format.MyFormatExpr()
1467 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001468 v9.CheckScriptSuccess(lines)
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001469
1470 new
1471 setline(1, ['a', 'b', 'c'])
1472 normal gqG
1473 assert_equal('yes', g:did_format)
1474
1475 bwipe!
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001476 unlet g:did_format
1477 set formatexpr=
1478enddef
1479
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001480def Test_import_in_includeexpr()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001481 writefile(['found it'], 'Xthisfile', 'D')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001482 new
1483
1484 var lines =<< trim END
1485 vim9script
1486 export def DoSub(): string
1487 return substitute(v:fname, 'that', 'this', '')
1488 enddef
1489 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001490 writefile(lines, 'Xinclude.vim', 'D')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001491
1492 lines =<< trim END
1493 vim9script
1494 import './Xinclude.vim'
1495 set includeexpr=Xinclude.DoSub()
1496 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001497 v9.CheckScriptSuccess(lines)
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001498
1499 setline(1, ['Xthatfile'])
1500 exe "normal \<C-W>f"
1501 assert_equal('Xthisfile', expand('%'))
1502
1503 bwipe!
1504 bwipe!
1505 set includeexpr=
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001506enddef
1507
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001508def Test_import_in_indentexpr()
1509 var lines =<< trim END
1510 vim9script
1511 export def GetIndent(): number
1512 return 5
1513 enddef
1514 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001515 writefile(lines, 'Xindenter', 'D')
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001516
1517 lines =<< trim END
1518 vim9script
1519 import './Xindenter' as indent
1520 set indentexpr=indent.GetIndent()
1521 set debug=throw
1522 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001523 v9.CheckScriptSuccess(lines)
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001524
1525 new
1526 setline(1, 'hello')
1527 normal ==
1528 assert_equal(' hello', getline(1))
1529
1530 bwipe!
1531 set indentexpr= debug=
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001532enddef
1533
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001534func Test_import_in_printexpr()
1535 CheckFeature postscript
1536 call Run_Test_import_in_printexpr()
1537endfunc
1538
1539def Run_Test_import_in_printexpr()
1540 var lines =<< trim END
1541 vim9script
1542 export def PrintFile(): bool
1543 g:printed = 'yes'
1544 delete('v:fname_in')
1545 return false
1546 enddef
1547 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001548 writefile(lines, 'Xprint.vim', 'D')
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001549
1550 lines =<< trim END
1551 vim9script
1552 import './Xprint.vim'
1553 set printexpr=Xprint.PrintFile()
1554 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001555 v9.CheckScriptSuccess(lines)
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001556
1557 help
1558 hardcopy dummy args
1559 assert_equal('yes', g:printed)
1560
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001561 set printexpr=
1562enddef
1563
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001564" Test for using an imported function as 'findfunc'
1565func Test_import_in_findfunc()
1566 call Run_Test_import_in_findfunc()
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001567endfunc
1568
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001569def Run_Test_import_in_findfunc()
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001570 var lines =<< trim END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001571 vim9script
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001572
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001573 export def FindFunc(pat: string, cmdexpand: bool): list<string>
1574 var fnames = ['Xfile1.c', 'Xfile2.c', 'Xfile3.c']
1575 return fnames->filter((_, v) => v =~? pat)
1576 enddef
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001577 END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001578 writefile(lines, 'Xfindfunc', 'D')
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001579
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001580 # Test using the "set" command
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001581 lines =<< trim END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001582 vim9script
1583 import './Xfindfunc' as find1
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001584
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001585 set findfunc=find1.FindFunc
1586 END
1587 v9.CheckScriptSuccess(lines)
1588
1589 enew!
1590 find Xfile2
1591 assert_equal('Xfile2.c', @%)
1592 bwipe!
1593
1594 botright vert new
1595 find Xfile1
1596 assert_equal('Xfile1.c', @%)
1597 bw!
1598
1599 # Test using the option variable
1600 lines =<< trim END
1601 vim9script
1602 import './Xfindfunc' as find2
1603
1604 &findfunc = find2.FindFunc
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001605 END
1606 v9.CheckScriptSuccess(lines)
1607
1608 enew!
1609 find Xfile2
1610 assert_equal('Xfile2.c', @%)
1611 bwipe!
1612
1613 botright vert new
1614 find Xfile1
1615 assert_equal('Xfile1.c', @%)
1616
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001617 set findfunc=
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001618 bwipe!
1619enddef
1620
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001621def Test_import_in_charconvert()
1622 var lines =<< trim END
1623 vim9script
1624 export def MakeUpper(): bool
1625 var data = readfile(v:fname_in)
1626 map(data, 'toupper(v:val)')
1627 writefile(data, v:fname_out)
1628 return false # success
1629 enddef
1630 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001631 writefile(lines, 'Xconvert.vim', 'D')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001632
1633 lines =<< trim END
1634 vim9script
1635 import './Xconvert.vim' as conv
1636 set charconvert=conv.MakeUpper()
1637 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001638 v9.CheckScriptSuccess(lines)
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001639
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001640 writefile(['one', 'two'], 'Xiicfile', 'D')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001641 new Xiicfile
1642 write ++enc=ucase Xiicfile1
1643 assert_equal(['ONE', 'TWO'], readfile('Xiicfile1'))
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001644
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001645 delete('Xiicfile1')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001646 bwipe!
1647 set charconvert&
1648enddef
1649
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001650func Test_import_in_spellsuggest_expr()
1651 CheckFeature spell
1652 call Run_Test_import_in_spellsuggest_expr()
1653endfunc
1654
1655def Run_Test_import_in_spellsuggest_expr()
1656 var lines =<< trim END
1657 vim9script
1658 export def MySuggest(): list<any>
1659 return [['Fox', 8], ['Fop', 9]]
1660 enddef
1661 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001662 writefile(lines, 'Xsuggest.vim', 'D')
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001663
1664 lines =<< trim END
1665 vim9script
1666 import './Xsuggest.vim' as sugg
1667 set spell spellsuggest=expr:sugg.MySuggest()
1668 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001669 v9.CheckScriptSuccess(lines)
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001670
1671 set verbose=1 # report errors
1672 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
1673
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001674 set nospell spellsuggest& verbose=0
1675enddef
1676
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001677def Test_import_in_lambda_method()
1678 var lines =<< trim END
1679 vim9script
1680 export def Retarg(e: any): any
1681 return e
1682 enddef
1683 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001684 writefile(lines, 'XexportRetarg.vim', 'D')
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001685 lines =<< trim END
1686 vim9script
1687 import './XexportRetarg.vim'
1688 def Lambda(): string
1689 var F = (x) => x->XexportRetarg.Retarg()
1690 return F('arg')
1691 enddef
1692 assert_equal('arg', Lambda())
1693 END
1694 v9.CheckScriptSuccess(lines)
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001695enddef
1696
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001697def Test_export_shadows_global_function()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001698 mkdir('Xglobdir/autoload', 'pR')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001699 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001700 exe 'set rtp^=' .. getcwd() .. '/Xglobdir'
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001701
1702 var lines =<< trim END
1703 vim9script
1704 export def Shadow(): string
1705 return 'Shadow()'
1706 enddef
1707 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001708 writefile(lines, 'Xglobdir/autoload/shadow.vim')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001709
1710 lines =<< trim END
1711 vim9script
1712
1713 def g:Shadow(): string
1714 return 'global'
1715 enddef
1716
1717 import autoload 'shadow.vim'
1718 assert_equal('Shadow()', shadow.Shadow())
1719 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001720 v9.CheckScriptSuccess(lines)
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001721
1722 delfunc g:Shadow
1723 bwipe!
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001724 &rtp = save_rtp
1725enddef
1726
Bram Moolenaard8448622022-01-07 21:39:52 +00001727def Test_export_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001728 v9.CheckScriptFailure(['export var some = 123'], 'E1042:')
1729 v9.CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1730 v9.CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01001731 v9.CheckScriptFailure(['vim9script', 'export function /a1b2c3'], 'E1044:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001732
Bram Moolenaar5ab30012022-10-07 17:26:22 +01001733 assert_fails('export echo 1', 'E1043:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001734enddef
1735
1736func Test_import_fails_without_script()
1737 CheckRunVimInTerminal
1738
1739 " call indirectly to avoid compilation error for missing functions
1740 call Run_Test_import_fails_on_command_line()
1741endfunc
1742
1743def Run_Test_import_fails_on_command_line()
1744 var export =<< trim END
1745 vim9script
1746 export def Foo(): number
1747 return 0
1748 enddef
1749 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001750 writefile(export, 'XexportCmd.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001751
Bram Moolenaar62aec932022-01-29 21:45:34 +00001752 var buf = g:RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaard8448622022-01-07 21:39:52 +00001753 rows: 6, wait_for_ruler: 0})
Bram Moolenaar62aec932022-01-29 21:45:34 +00001754 g:WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaard8448622022-01-07 21:39:52 +00001755
Bram Moolenaar62aec932022-01-29 21:45:34 +00001756 g:StopVimInTerminal(buf)
Bram Moolenaard8448622022-01-07 21:39:52 +00001757enddef
1758
1759def Test_vim9_reload_noclear()
1760 var lines =<< trim END
1761 vim9script
1762 export var exported = 'thexport'
1763
1764 export def TheFunc(x = 0)
1765 enddef
1766 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001767 writefile(lines, 'XExportReload', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001768 lines =<< trim END
1769 vim9script noclear
1770 g:loadCount += 1
Bram Moolenaara749a422022-02-12 19:52:25 +00001771 var reloaded = 'init'
Bram Moolenaard8448622022-01-07 21:39:52 +00001772 import './XExportReload' as exp
1773
1774 def Again(): string
1775 return 'again'
1776 enddef
1777
1778 exp.TheFunc()
1779
Bram Moolenaara749a422022-02-12 19:52:25 +00001780 if exists('loaded') | finish | endif
1781 var loaded = true
Bram Moolenaard8448622022-01-07 21:39:52 +00001782
Bram Moolenaara749a422022-02-12 19:52:25 +00001783 var notReloaded = 'yes'
1784 reloaded = 'first'
Bram Moolenaard8448622022-01-07 21:39:52 +00001785 def g:Values(): list<string>
Bram Moolenaara749a422022-02-12 19:52:25 +00001786 return [reloaded, notReloaded, Again(), Once(), exp.exported]
Bram Moolenaard8448622022-01-07 21:39:52 +00001787 enddef
1788
1789 def Once(): string
1790 return 'once'
1791 enddef
1792 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001793 writefile(lines, 'XReloaded', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001794 g:loadCount = 0
1795 source XReloaded
1796 assert_equal(1, g:loadCount)
1797 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1798 source XReloaded
1799 assert_equal(2, g:loadCount)
1800 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1801 source XReloaded
1802 assert_equal(3, g:loadCount)
1803 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1804
Bram Moolenaard8448622022-01-07 21:39:52 +00001805 delfunc g:Values
1806 unlet g:loadCount
1807
1808 lines =<< trim END
1809 vim9script
1810 def Inner()
1811 enddef
1812 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001813 lines->writefile('XreloadScript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001814 source XreloadScript.vim
1815
1816 lines =<< trim END
1817 vim9script
1818 def Outer()
1819 def Inner()
1820 enddef
1821 enddef
1822 defcompile
1823 END
1824 lines->writefile('XreloadScript.vim')
1825 source XreloadScript.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00001826enddef
1827
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001828def Test_vim_reload_noclear_arg_count()
1829 var lines =<< trim END
1830 vim9script noclear
1831
1832 if !exists('g:didload')
1833 def Test(a: string, b: string)
1834 echo a b
1835 enddef
1836 def Call()
1837 Test('a', 'b')
1838 enddef
1839 else
1840 # redefine with one argument less
1841 def Test(a: string)
1842 echo a
1843 enddef
1844 endif
1845 Call()
1846 g:didload = 1
1847 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001848 lines->writefile('XreloadScript_1.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001849 source XreloadScript_1.vim
1850 assert_fails('source XreloadScript_1.vim', 'E1106: One argument too many')
1851 unlet g:didload
1852
1853 lines =<< trim END
1854 vim9script noclear
1855
1856 if !exists('g:didload')
1857 def Test(a: string, b: string, c: string)
1858 echo a b
1859 enddef
1860 def Call()
1861 Test('a', 'b', 'c')
1862 enddef
1863 else
1864 # redefine with one argument less
1865 def Test(a: string)
1866 echo a
1867 enddef
1868 endif
1869 Call()
1870 g:didload = 1
1871 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001872 lines->writefile('XreloadScript_2.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001873 source XreloadScript_2.vim
1874 assert_fails('source XreloadScript_2.vim', 'E1106: 2 arguments too many')
1875 unlet g:didload
1876
1877 lines =<< trim END
1878 vim9script noclear
1879
1880 if !exists('g:didload')
1881 def Test(a: string)
1882 echo a
1883 enddef
1884 def Call()
1885 Test('a')
1886 enddef
1887 else
1888 # redefine with one argument extra
1889 def Test(a: string, b: string)
1890 echo a b
1891 enddef
1892 endif
1893 Call()
1894 g:didload = 1
1895 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001896 lines->writefile('XreloadScript_3.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001897 source XreloadScript_3.vim
1898 assert_fails('source XreloadScript_3.vim', 'E1190: One argument too few')
1899 unlet g:didload
1900
1901 lines =<< trim END
1902 vim9script noclear
1903
1904 if !exists('g:didload')
1905 def Test(a: string)
1906 echo a
1907 enddef
1908 def Call()
1909 Test('a')
1910 enddef
1911 else
1912 # redefine with two arguments extra
1913 def Test(a: string, b: string, c: string)
1914 echo a b
1915 enddef
1916 endif
1917 Call()
1918 g:didload = 1
1919 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001920 lines->writefile('XreloadScript_4.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001921 source XreloadScript_4.vim
1922 assert_fails('source XreloadScript_4.vim', 'E1190: 2 arguments too few')
1923 unlet g:didload
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001924enddef
1925
1926def Test_vim9_reload_noclear_error()
1927 var lines =<< trim END
1928 vim9script noclear
1929
1930 if !exists('g:didload')
1931 def Test(a: string)
1932 echo a
1933 enddef
1934 def Call()
1935 Test('a')
1936 enddef
1937 else
1938 # redefine with a compile error
1939 def Test(a: string)
1940 echo ax
1941 enddef
1942 endif
1943 Call()
1944 g:didload = 1
1945 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001946 lines->writefile('XreloadScriptErr.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001947 source XreloadScriptErr.vim
1948 assert_fails('source XreloadScriptErr.vim', 'E1001: Variable not found: ax')
1949
1950 unlet g:didload
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001951enddef
1952
Bram Moolenaard8448622022-01-07 21:39:52 +00001953def Test_vim9_reload_import()
1954 var lines =<< trim END
1955 vim9script
1956 const var = ''
1957 var valone = 1234
1958 def MyFunc(arg: string)
1959 valone = 5678
1960 enddef
1961 END
1962 var morelines =<< trim END
1963 var valtwo = 222
1964 export def GetValtwo(): number
1965 return valtwo
1966 enddef
1967 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001968 writefile(lines + morelines, 'Xreload.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001969 source Xreload.vim
1970 source Xreload.vim
1971 source Xreload.vim
1972
1973 # cannot declare a var twice
1974 lines =<< trim END
1975 vim9script
1976 var valone = 1234
1977 var valone = 5678
1978 END
1979 writefile(lines, 'Xreload.vim')
1980 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1981
Bram Moolenaard8448622022-01-07 21:39:52 +00001982 delete('Ximport.vim')
1983enddef
1984
1985" if a script is reloaded with a script-local variable that changed its type, a
1986" compiled function using that variable must fail.
1987def Test_script_reload_change_type()
1988 var lines =<< trim END
1989 vim9script noclear
1990 var str = 'string'
1991 def g:GetStr(): string
1992 return str .. 'xxx'
1993 enddef
1994 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001995 writefile(lines, 'Xreload.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001996 source Xreload.vim
1997 echo g:GetStr()
1998
1999 lines =<< trim END
2000 vim9script noclear
2001 var str = 1234
2002 END
2003 writefile(lines, 'Xreload.vim')
2004 source Xreload.vim
2005 assert_fails('echo g:GetStr()', 'E1150:')
2006
2007 delfunc g:GetStr
Bram Moolenaard8448622022-01-07 21:39:52 +00002008enddef
2009
2010" Define CallFunc so that the test can be compiled
2011command CallFunc echo 'nop'
2012
2013def Test_script_reload_from_function()
2014 var lines =<< trim END
2015 vim9script
2016
Bram Moolenaar10611952022-04-03 21:11:34 +01002017 if exists('g:loadedThis')
Bram Moolenaard8448622022-01-07 21:39:52 +00002018 finish
2019 endif
Bram Moolenaar10611952022-04-03 21:11:34 +01002020 g:loadedThis = 1
Bram Moolenaard8448622022-01-07 21:39:52 +00002021 delcommand CallFunc
2022 command CallFunc Func()
2023 def Func()
2024 so XreloadFunc.vim
2025 g:didTheFunc = 1
2026 enddef
2027 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002028 writefile(lines, 'XreloadFunc.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002029 source XreloadFunc.vim
2030 CallFunc
2031 assert_equal(1, g:didTheFunc)
2032
Bram Moolenaard8448622022-01-07 21:39:52 +00002033 delcommand CallFunc
Bram Moolenaar10611952022-04-03 21:11:34 +01002034 unlet g:loadedThis
Bram Moolenaard8448622022-01-07 21:39:52 +00002035 unlet g:didTheFunc
2036enddef
2037
2038def s:RetSome(): string
2039 return 'some'
2040enddef
2041
2042" Not exported function that is referenced needs to be accessed by the
2043" script-local name.
2044def Test_vim9_funcref()
2045 var sortlines =<< trim END
2046 vim9script
2047 def Compare(i1: number, i2: number): number
2048 return i2 - i1
2049 enddef
2050
2051 export def FastSort(): list<number>
2052 return range(5)->sort(Compare)
2053 enddef
2054
2055 export def GetString(arg: string): string
2056 return arg
2057 enddef
2058 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002059 writefile(sortlines, 'Xsort.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002060
2061 var lines =<< trim END
2062 vim9script
2063 import './Xsort.vim'
2064 def Test()
2065 g:result = Xsort.FastSort()
2066 enddef
2067 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002068 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002069 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002070 source Xscript.vim
2071 assert_equal([4, 3, 2, 1, 0], g:result)
2072 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00002073
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002074 lines =<< trim END
2075 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00002076 # using a function imported with "as"
2077 import './Xsort.vim' as anAlias
2078 assert_equal('yes', anAlias.GetString('yes'))
2079
2080 # using the function from a compiled function
2081 def TestMore(): string
2082 var s = s:anAlias.GetString('foo')
2083 return s .. anAlias.GetString('bar')
2084 enddef
2085 assert_equal('foobar', TestMore())
2086
2087 # error when using a function that isn't exported
2088 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
2089 END
2090 writefile(lines, 'Xscript.vim')
2091
Bram Moolenaard8448622022-01-07 21:39:52 +00002092 var Funcref = function('s:RetSome')
2093 assert_equal('some', Funcref())
2094enddef
2095
2096" Check that when searching for "FilterFunc" it finds the import in the
2097" script where FastFilter() is called from, both as a string and as a direct
2098" function reference.
2099def Test_vim9_funcref_other_script()
2100 var filterLines =<< trim END
2101 vim9script
2102 export def FilterFunc(idx: number, val: number): bool
2103 return idx % 2 == 1
2104 enddef
2105 export def FastFilter(): list<number>
2106 return range(10)->filter('FilterFunc(v:key, v:val)')
2107 enddef
2108 export def FastFilterDirect(): list<number>
2109 return range(10)->filter(FilterFunc)
2110 enddef
2111 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002112 writefile(filterLines, 'Xfilter.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002113
2114 var lines =<< trim END
2115 vim9script
2116 import './Xfilter.vim' as filter
2117 def Test()
2118 var x: list<number> = filter.FastFilter()
2119 enddef
2120 Test()
2121 def TestDirect()
2122 var x: list<number> = filter.FastFilterDirect()
2123 enddef
2124 TestDirect()
2125 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002126 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +00002127enddef
2128
2129def Test_import_absolute()
2130 var import_lines = [
2131 'vim9script',
2132 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
2133 'def UseExported()',
2134 ' g:imported_abs = abs.exported',
2135 ' abs.exported = 8888',
2136 ' g:imported_after = abs.exported',
2137 'enddef',
2138 'UseExported()',
2139 'g:import_disassembled = execute("disass UseExported")',
2140 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002141 writefile(import_lines, 'Ximport_abs.vim', 'D')
2142 writefile(s:export_script_lines, 'Xexport_abs.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002143
2144 source Ximport_abs.vim
2145
2146 assert_equal(9876, g:imported_abs)
2147 assert_equal(8888, g:imported_after)
2148 assert_match('<SNR>\d\+_UseExported\_s*' ..
2149 'g:imported_abs = abs.exported\_s*' ..
2150 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2151 '1 STOREG g:imported_abs\_s*' ..
2152 'abs.exported = 8888\_s*' ..
2153 '2 PUSHNR 8888\_s*' ..
2154 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2155 'g:imported_after = abs.exported\_s*' ..
2156 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2157 '5 STOREG g:imported_after',
2158 g:import_disassembled)
2159
2160 Undo_export_script_lines()
2161 unlet g:imported_abs
2162 unlet g:import_disassembled
Bram Moolenaard8448622022-01-07 21:39:52 +00002163enddef
2164
2165def Test_import_rtp()
2166 var import_lines = [
2167 'vim9script',
2168 'import "Xexport_rtp.vim" as rtp',
2169 'g:imported_rtp = rtp.exported',
2170 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002171 writefile(import_lines, 'Ximport_rtp.vim', 'D')
2172 mkdir('import', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +00002173 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
2174
2175 var save_rtp = &rtp
2176 &rtp = getcwd()
2177 source Ximport_rtp.vim
2178 &rtp = save_rtp
2179
2180 assert_equal(9876, g:imported_rtp)
2181
2182 Undo_export_script_lines()
2183 unlet g:imported_rtp
Bram Moolenaard8448622022-01-07 21:39:52 +00002184enddef
2185
2186def Test_import_compile_error()
2187 var export_lines = [
2188 'vim9script',
2189 'export def ExpFunc(): string',
2190 ' return notDefined',
2191 'enddef',
2192 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002193 writefile(export_lines, 'Xexported.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002194
2195 var import_lines = [
2196 'vim9script',
2197 'import "./Xexported.vim" as expo',
2198 'def ImpFunc()',
2199 ' echo expo.ExpFunc()',
2200 'enddef',
2201 'defcompile',
2202 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002203 writefile(import_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002204
2205 try
2206 source Ximport.vim
2207 catch /E1001/
2208 # Error should be before the Xexported.vim file.
2209 assert_match('E1001: Variable not found: notDefined', v:exception)
2210 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
2211 endtry
Bram Moolenaard8448622022-01-07 21:39:52 +00002212enddef
2213
2214def Test_func_overrules_import_fails()
2215 var export_lines =<< trim END
2216 vim9script
2217 export def Func()
2218 echo 'imported'
2219 enddef
2220 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002221 writefile(export_lines, 'XexportedFunc.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002222
2223 var lines =<< trim END
2224 vim9script
2225 import './XexportedFunc.vim' as Func
2226 def Func()
2227 echo 'local to function'
2228 enddef
2229 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002230 v9.CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00002231
2232 lines =<< trim END
2233 vim9script
2234 import './XexportedFunc.vim' as Func
2235 def Outer()
2236 def Func()
2237 echo 'local to function'
2238 enddef
2239 enddef
2240 defcompile
2241 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002242 v9.CheckScriptFailure(lines, 'E1236:')
Bram Moolenaard8448622022-01-07 21:39:52 +00002243enddef
2244
2245def Test_source_vim9_from_legacy()
2246 var vim9_lines =<< trim END
2247 vim9script
2248 var local = 'local'
2249 g:global = 'global'
2250 export var exported = 'exported'
2251 export def GetText(): string
2252 return 'text'
2253 enddef
2254 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002255 writefile(vim9_lines, 'Xvim9_script.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002256
2257 var legacy_lines =<< trim END
2258 source Xvim9_script.vim
2259
2260 call assert_false(exists('local'))
2261 call assert_false(exists('exported'))
2262 call assert_false(exists('s:exported'))
2263 call assert_equal('global', global)
2264 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00002265 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002266 writefile(legacy_lines, 'Xlegacy_script.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002267
2268 source Xlegacy_script.vim
2269 assert_equal('global', g:global)
2270 unlet g:global
Bram Moolenaarb775e722022-11-22 18:12:44 +00002271
2272 legacy_lines =<< trim END
2273 import './Xvim9_script.vim'
2274 let g:global = s:Xvim9_script.GetText()
2275 END
2276 writefile(legacy_lines, 'Xlegacyimport.vim', 'D')
2277 source Xlegacyimport.vim
2278 assert_equal('text', g:global)
2279 unlet g:global
Bram Moolenaard8448622022-01-07 21:39:52 +00002280enddef
2281
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002282def Test_import_vim9_from_legacy()
2283 var vim9_lines =<< trim END
2284 vim9script
2285 var local = 'local'
2286 g:global = 'global'
2287 export var exported = 'exported'
2288 export def GetText(): string
2289 return 'text'
2290 enddef
Yegappan Lakshmananf1750ca2024-04-02 20:41:04 +02002291 export var exported_nr: number = 22
2292 def AddNum(n: number)
2293 exported_nr += n
2294 enddef
2295 export var exportedDict: dict<func> = {Fn: AddNum}
2296 export const CONST = 10
2297 export final finalVar = 'abc'
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002298 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002299 writefile(vim9_lines, 'Xvim9_export.vim', 'D')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002300
2301 var legacy_lines =<< trim END
2302 import './Xvim9_export.vim' as vim9
2303
2304 call assert_false(exists('vim9'))
2305 call assert_false(exists('local'))
2306 call assert_false(exists('s:vim9.local'))
2307 call assert_equal('global', global)
2308 call assert_equal('global', g:global)
2309 call assert_false(exists('exported'))
2310 call assert_false(exists('s:exported'))
2311 call assert_false(exists('*GetText'))
2312
2313 " imported symbol is script-local
2314 call assert_equal('exported', s:vim9.exported)
2315 call assert_equal('text', s:vim9.GetText())
Yegappan Lakshmananf1750ca2024-04-02 20:41:04 +02002316 call s:vim9.exportedDict.Fn(5)
2317 call assert_equal(27, s:vim9.exported_nr)
2318 call call(s:vim9.exportedDict.Fn, [3])
2319 call assert_equal(30, s:vim9.exported_nr)
2320 call assert_fails('let s:vim9.CONST = 20', 'E46: Cannot change read-only variable "CONST"')
2321 call assert_fails('let s:vim9.finalVar = ""', 'E46: Cannot change read-only variable "finalVar"')
2322 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 +00002323 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002324 writefile(legacy_lines, 'Xlegacy_script.vim', 'D')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002325
2326 source Xlegacy_script.vim
2327 assert_equal('global', g:global)
2328 unlet g:global
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002329enddef
2330
Bram Moolenaard8448622022-01-07 21:39:52 +00002331def Test_cmdline_win()
2332 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
2333 # the command line window.
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002334 mkdir('rtp/syntax', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +00002335 var export_lines =<< trim END
2336 vim9script
2337 export var That = 'yes'
2338 END
2339 writefile(export_lines, 'rtp/syntax/Xexport.vim')
2340 var import_lines =<< trim END
2341 vim9script
2342 import './Xexport.vim' as exp
2343 echo exp.That
2344 END
2345 writefile(import_lines, 'rtp/syntax/vim.vim')
2346 var save_rtp = &rtp
2347 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
2348 syntax on
2349 augroup CmdWin
2350 autocmd CmdwinEnter * g:got_there = 'yes'
2351 augroup END
2352 # this will open and also close the cmdline window
2353 feedkeys('q:', 'xt')
2354 assert_equal('yes', g:got_there)
2355
2356 augroup CmdWin
2357 au!
2358 augroup END
2359 &rtp = save_rtp
Bram Moolenaard8448622022-01-07 21:39:52 +00002360enddef
2361
2362def Test_import_gone_when_sourced_twice()
2363 var exportlines =<< trim END
2364 vim9script
2365 if exists('g:guard')
2366 finish
2367 endif
2368 g:guard = 1
2369 export var name = 'someName'
2370 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002371 writefile(exportlines, 'XexportScript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002372
2373 var lines =<< trim END
2374 vim9script
2375 import './XexportScript.vim' as expo
2376 def g:GetName(): string
2377 return expo.name
2378 enddef
2379 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002380 writefile(lines, 'XscriptImport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002381 so XscriptImport.vim
2382 assert_equal('someName', g:GetName())
2383
2384 so XexportScript.vim
2385 assert_fails('call g:GetName()', 'E1149:')
2386
2387 delfunc g:GetName
Bram Moolenaard8448622022-01-07 21:39:52 +00002388 unlet g:guard
2389enddef
2390
Bram Moolenaar160aa862022-01-10 21:29:57 +00002391" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002392def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002393 var lines =<< trim END
2394 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002395 export def Gettest(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002396 return 'test'
2397 enddef
2398 g:some#name = 'name'
2399 g:some#dict = {key: 'value'}
2400
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002401 export def Varargs(a1: string, ...l: list<string>): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002402 return a1 .. l[0] .. l[1]
2403 enddef
2404 END
2405
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002406 mkdir('Xfulldir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002407 writefile(lines, 'Xfulldir/autoload/some.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002408 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002409 exe 'set rtp^=' .. getcwd() .. '/Xfulldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002410
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002411 assert_equal('test', g:some#Gettest())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002412 assert_equal('name', g:some#name)
2413 assert_equal('value', g:some#dict.key)
2414 g:some#other = 'other'
2415 assert_equal('other', g:some#other)
2416
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002417 assert_equal('abc', some#Varargs('a', 'b', 'c'))
Bram Moolenaar160aa862022-01-10 21:29:57 +00002418
2419 # upper case script name works
2420 lines =<< trim END
2421 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002422 export def GetOther(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002423 return 'other'
2424 enddef
2425 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002426 writefile(lines, 'Xfulldir/autoload/Other.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002427 assert_equal('other', g:Other#GetOther())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002428
Bram Moolenaar160aa862022-01-10 21:29:57 +00002429 &rtp = save_rtp
2430enddef
2431
2432def Test_vim9script_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002433 mkdir('Xaldir/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002434 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002435 exe 'set rtp^=' .. getcwd() .. '/Xaldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002436
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002437 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00002438 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002439 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002440 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00002441
2442 export def Gettest(): string
2443 return 'test'
2444 enddef
2445
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002446 export var name = 'name'
2447
2448 export func GetFunc()
2449 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00002450 endfunc
2451
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002452 export def GetDef(): string
2453 return Gettest() .. 'more' .. name
2454 enddef
2455
Bram Moolenaar160aa862022-01-10 21:29:57 +00002456 export final fname = 'final'
2457 export const cname = 'const'
2458 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002459 writefile(lines, 'Xaldir/autoload/prefixed.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002460
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002461 g:prefixed_loaded = 0
2462 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00002463 lines =<< trim END
2464 vim9script
2465 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002466 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002467 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002468 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002469
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002470 assert_equal('testmorename', prefixed.GetFunc())
2471 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002472 assert_equal('name', prefixed.name)
2473 assert_equal('final', prefixed.fname)
2474 assert_equal('const', prefixed.cname)
2475 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002476 v9.CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002477 # can source it again, autoload script not loaded again
2478 g:expected_loaded = 1
Bram Moolenaar62aec932022-01-29 21:45:34 +00002479 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002480
2481 # can also get the items by autoload name
2482 lines =<< trim END
2483 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002484 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002485 call assert_equal('name', prefixed#name)
2486 call assert_equal('final', prefixed#fname)
2487 call assert_equal('const', prefixed#cname)
2488 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002489 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002490
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002491 unlet g:prefixed_loaded
2492 unlet g:expected_loaded
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002493 &rtp = save_rtp
2494enddef
2495
Bram Moolenaard02dce22022-01-18 17:43:04 +00002496def Test_import_autoload_not_exported()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002497 mkdir('Xnimdir/autoload', 'pR')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002498 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002499 exe 'set rtp^=' .. getcwd() .. '/Xnimdir'
Bram Moolenaard02dce22022-01-18 17:43:04 +00002500
2501 # error when using an item that is not exported from an autoload script
2502 var exportLines =<< trim END
2503 vim9script
2504 var notExported = 123
2505 def NotExport()
2506 echo 'nop'
2507 enddef
2508 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002509 writefile(exportLines, 'Xnimdir/autoload/notExport1.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002510
2511 var lines =<< trim END
2512 vim9script
2513 import autoload 'notExport1.vim'
2514 echo notExport1.notFound
2515 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002516 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002517
2518 lines =<< trim END
2519 vim9script
2520 import autoload 'notExport1.vim'
2521 echo notExport1.notExported
2522 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002523 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002524
2525 lines =<< trim END
2526 vim9script
2527 import autoload 'notExport1.vim'
2528 echo notExport1.NotFunc()
2529 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002530 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002531
2532 lines =<< trim END
2533 vim9script
2534 import autoload 'notExport1.vim'
2535 echo notExport1.NotExport()
2536 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002537 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002538
2539 lines =<< trim END
2540 vim9script
2541 import autoload 'notExport1.vim'
2542 echo 'text'->notExport1.NotFunc()
2543 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002544 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002545
2546 lines =<< trim END
2547 vim9script
2548 import autoload 'notExport1.vim'
2549 echo 'text'->notExport1.NotExport()
2550 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002551 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002552
2553 # using a :def function we use a different autoload script every time so that
2554 # the function is compiled without the script loaded
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002555 writefile(exportLines, 'Xnimdir/autoload/notExport2.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002556 lines =<< trim END
2557 vim9script
2558 import autoload 'notExport2.vim'
2559 def Testit()
2560 echo notExport2.notFound
2561 enddef
2562 Testit()
2563 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002564 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002565
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002566 writefile(exportLines, 'Xnimdir/autoload/notExport3.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002567 lines =<< trim END
2568 vim9script
2569 import autoload 'notExport3.vim'
2570 def Testit()
2571 echo notExport3.notExported
2572 enddef
2573 Testit()
2574 END
2575 # don't get E1049 because it is too complicated to figure out
Bram Moolenaar62aec932022-01-29 21:45:34 +00002576 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002577
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002578 writefile(exportLines, 'Xnimdir/autoload/notExport4.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002579 lines =<< trim END
2580 vim9script
2581 import autoload 'notExport4.vim'
2582 def Testit()
2583 echo notExport4.NotFunc()
2584 enddef
2585 Testit()
2586 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002587 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002588
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002589 writefile(exportLines, 'Xnimdir/autoload/notExport5.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002590 lines =<< trim END
2591 vim9script
2592 import autoload 'notExport5.vim'
2593 def Testit()
2594 echo notExport5.NotExport()
2595 enddef
2596 Testit()
2597 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002598 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002599
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002600 writefile(exportLines, 'Xnimdir/autoload/notExport6.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002601 lines =<< trim END
2602 vim9script
2603 import autoload 'notExport6.vim'
2604 def Testit()
2605 echo 'text'->notExport6.NotFunc()
2606 enddef
2607 Testit()
2608 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002609 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002610
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002611 writefile(exportLines, 'Xnimdir/autoload/notExport7.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002612 lines =<< trim END
2613 vim9script
2614 import autoload 'notExport7.vim'
2615 def Testit()
2616 echo 'text'->notExport7.NotExport()
2617 enddef
2618 Testit()
2619 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002620 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002621
Bram Moolenaard02dce22022-01-18 17:43:04 +00002622 &rtp = save_rtp
2623enddef
2624
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002625def Test_vim9script_autoload_call()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002626 mkdir('Xcalldir/autoload', 'pR')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002627 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002628 exe 'set rtp^=' .. getcwd() .. '/Xcalldir'
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002629
2630 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002631 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002632
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002633 export def RetArg(arg: string): string
2634 return arg
2635 enddef
2636
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002637 export def Getother()
2638 g:result = 'other'
2639 enddef
2640 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002641 writefile(lines, 'Xcalldir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002642
2643 lines =<< trim END
2644 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00002645 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002646
2647 # compile this before 'another.vim' is loaded
2648 def CallAnother()
2649 assert_equal('foo', 'foo'->another.RetArg())
2650 enddef
2651 CallAnother()
2652
Bram Moolenaar5d982692022-01-12 15:15:27 +00002653 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002654 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00002655
2656 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaar8164f6e2022-02-06 13:08:41 +00002657
2658 verbose function another.Getother
2659 # should we disallow this?
2660 verbose function another#Getother
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002661 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002662 v9.CheckScriptSuccess(lines)
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002663
2664 unlet g:result
Bram Moolenaar160aa862022-01-10 21:29:57 +00002665 &rtp = save_rtp
2666enddef
2667
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002668def Test_vim9script_noclear_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002669 mkdir('Xnocdir/autoload', 'pR')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002670 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002671 exe 'set rtp^=' .. getcwd() .. '/Xnocdir'
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002672
2673 var lines =<< trim END
2674 vim9script
2675 export def Func(): string
2676 return 'called'
2677 enddef
2678 g:double_loaded = 'yes'
2679 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002680 writefile(lines, 'Xnocdir/autoload/double.vim')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002681
2682 lines =<< trim END
2683 vim9script noclear
2684 if exists('g:script_loaded')
2685 finish
2686 endif
2687 g:script_loaded = true
2688
2689 import autoload 'double.vim'
2690 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
2691 END
2692 g:double_loaded = 'no'
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002693 writefile(lines, 'Xloaddouble', 'D')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002694 source Xloaddouble
2695 assert_equal('no', g:double_loaded)
2696 assert_equal(true, g:script_loaded)
2697 source Xloaddouble
2698 feedkeys("\<F3>", 'xt')
2699 assert_equal('called', g:result)
2700 assert_equal('yes', g:double_loaded)
2701
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002702 unlet g:double_loaded
2703 unlet g:script_loaded
2704 unlet g:result
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002705 &rtp = save_rtp
2706enddef
2707
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002708def Test_vim9script_autoload_duplicate()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002709 mkdir('Xdupdir/autoload', 'pR')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002710
2711 var lines =<< trim END
2712 vim9script
2713
2714 export def Func()
2715 enddef
2716
2717 def Func()
2718 enddef
2719 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002720 writefile(lines, 'Xdupdir/autoload/dupfunc.vim')
2721 assert_fails('source Xdupdir/autoload/dupfunc.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002722
2723 lines =<< trim END
2724 vim9script
2725
2726 def Func()
2727 enddef
2728
2729 export def Func()
2730 enddef
2731 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002732 writefile(lines, 'Xdupdir/autoload/dup2func.vim')
2733 assert_fails('source Xdupdir/autoload/dup2func.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002734
2735 lines =<< trim END
2736 vim9script
2737
2738 def Func()
2739 enddef
2740
2741 export var Func = 'asdf'
2742 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002743 writefile(lines, 'Xdupdir/autoload/dup3func.vim')
2744 assert_fails('source Xdupdir/autoload/dup3func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002745
2746 lines =<< trim END
2747 vim9script
2748
2749 export var Func = 'asdf'
2750
2751 def Func()
2752 enddef
2753 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002754 writefile(lines, 'Xdupdir/autoload/dup4func.vim')
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01002755 assert_fails('source Xdupdir/autoload/dup4func.vim', 'E1041:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002756
2757 lines =<< trim END
2758 vim9script
2759
2760 var Func = 'asdf'
2761
2762 export def Func()
2763 enddef
2764 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002765 writefile(lines, 'Xdupdir/autoload/dup5func.vim')
2766 assert_fails('source Xdupdir/autoload/dup5func.vim', 'E707:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002767
2768 lines =<< trim END
2769 vim9script
2770
2771 export def Func()
2772 enddef
2773
2774 var Func = 'asdf'
2775 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002776 writefile(lines, 'Xdupdir/autoload/dup6func.vim')
2777 assert_fails('source Xdupdir/autoload/dup6func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002778enddef
2779
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002780def Test_autoload_missing_function_name()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002781 mkdir('Xmisdir/autoload', 'pR')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002782
2783 var lines =<< trim END
2784 vim9script
2785
2786 def loadme#()
2787 enddef
2788 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002789 writefile(lines, 'Xmisdir/autoload/loadme.vim')
2790 assert_fails('source Xmisdir/autoload/loadme.vim', 'E129:')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002791enddef
2792
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002793def Test_autoload_name_wrong()
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002794 var lines =<< trim END
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002795 def Xscriptname#Func()
2796 enddef
2797 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002798 writefile(lines, 'Xscriptname.vim', 'D')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002799 v9.CheckScriptFailure(lines, 'E746:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002800
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002801 mkdir('Xwrodir/autoload', 'pR')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002802 lines =<< trim END
2803 vim9script
2804 def somescript#Func()
2805 enddef
2806 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002807 writefile(lines, 'Xwrodir/autoload/somescript.vim')
2808 assert_fails('source Xwrodir/autoload/somescript.vim', 'E1263:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002809
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002810 delete('Xwrodir', 'rf')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002811enddef
2812
Bram Moolenaard041f422022-01-12 19:54:00 +00002813def Test_import_autoload_postponed()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002814 mkdir('Xpostdir/autoload', 'pR')
Bram Moolenaard041f422022-01-12 19:54:00 +00002815 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002816 exe 'set rtp^=' .. getcwd() .. '/Xpostdir'
Bram Moolenaard041f422022-01-12 19:54:00 +00002817
2818 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002819 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00002820
2821 g:loaded_postponed = 'true'
2822 export var variable = 'bla'
2823 export def Function(): string
2824 return 'bla'
2825 enddef
2826 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002827 writefile(lines, 'Xpostdir/autoload/postponed.vim')
Bram Moolenaard041f422022-01-12 19:54:00 +00002828
2829 lines =<< trim END
2830 vim9script
2831
2832 import autoload 'postponed.vim'
2833 def Tryit()
2834 echo postponed.variable
2835 echo postponed.Function()
2836 enddef
2837 defcompile
2838 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002839 v9.CheckScriptSuccess(lines)
Bram Moolenaard041f422022-01-12 19:54:00 +00002840 assert_false(exists('g:loaded_postponed'))
Bram Moolenaar62aec932022-01-29 21:45:34 +00002841 v9.CheckScriptSuccess(lines + ['Tryit()'])
Bram Moolenaard041f422022-01-12 19:54:00 +00002842 assert_equal('true', g:loaded_postponed)
2843
2844 unlet g:loaded_postponed
Bram Moolenaard041f422022-01-12 19:54:00 +00002845 &rtp = save_rtp
2846enddef
2847
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002848def Test_import_autoload_override()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002849 mkdir('Xoverdir/autoload', 'pR')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002850 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002851 exe 'set rtp^=' .. getcwd() .. '/Xoverdir'
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002852 test_override('autoload', 1)
2853
2854 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002855 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002856
2857 g:loaded_override = 'true'
2858 export var variable = 'bla'
2859 export def Function(): string
2860 return 'bla'
2861 enddef
2862 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002863 writefile(lines, 'Xoverdir/autoload/override.vim')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002864
2865 lines =<< trim END
2866 vim9script
2867
2868 import autoload 'override.vim'
2869 assert_equal('true', g:loaded_override)
2870
2871 def Tryit()
2872 echo override.doesNotExist
2873 enddef
2874 defcompile
2875 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002876 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002877
2878 test_override('autoload', 0)
2879 unlet g:loaded_override
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002880 &rtp = save_rtp
2881enddef
2882
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002883def Test_autoload_mapping()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002884 mkdir('Xmapdir/autoload', 'pR')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002885 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002886 exe 'set rtp^=' .. getcwd() .. '/Xmapdir'
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002887
2888 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002889 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002890
2891 g:toggle_loaded = 'yes'
2892
2893 export def Toggle(): string
2894 return ":g:toggle_called = 'yes'\<CR>"
2895 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002896 export def Doit()
2897 g:doit_called = 'yes'
2898 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002899 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002900 writefile(lines, 'Xmapdir/autoload/toggle.vim')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002901
2902 lines =<< trim END
2903 vim9script
2904
2905 import autoload 'toggle.vim'
2906
Bram Moolenaar94722c52023-01-28 19:19:03 +00002907 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002908 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2909 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002910 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002911 v9.CheckScriptSuccess(lines)
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002912 assert_false(exists("g:toggle_loaded"))
2913 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002914 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002915
2916 feedkeys("tt", 'xt')
2917 assert_equal('yes', g:toggle_loaded)
2918 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002919 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002920
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002921 feedkeys("xx", 'xt')
2922 assert_equal('yes', g:doit_called)
2923
2924 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2925
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002926 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002927 nunmap xx
2928 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002929 unlet g:toggle_loaded
2930 unlet g:toggle_called
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002931 &rtp = save_rtp
2932enddef
2933
Bram Moolenaar160aa862022-01-10 21:29:57 +00002934def Test_vim9script_autoload_fails()
2935 var lines =<< trim END
2936 vim9script autoload
2937 var n = 0
2938 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002939 v9.CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002940
2941 lines =<< trim END
2942 vim9script noclear noclear
2943 var n = 0
2944 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002945 v9.CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01002946
2947 lines =<< trim END
2948 vim9script noclears
2949 var n = 0
2950 END
2951 v9.CheckScriptFailure(lines, 'E475: Invalid argument: noclears')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002952enddef
2953
2954def Test_import_autoload_fails()
2955 var lines =<< trim END
2956 vim9script
2957 import autoload autoload 'prefixed.vim'
2958 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002959 v9.CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002960
2961 lines =<< trim END
2962 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002963 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002964 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002965 v9.CheckScriptFailure(lines, 'E282:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002966
2967 lines =<< trim END
2968 vim9script
2969 import autoload '/dir/doesNotExist.vim'
2970 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002971 v9.CheckScriptFailure(lines, 'E282:', 2)
2972
2973 lines =<< trim END
2974 vim9script
2975 import autoload '../testdir'
2976 END
2977 v9.CheckScriptFailure(lines, 'E17:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002978
2979 lines =<< trim END
2980 vim9script
2981 import autoload 'doesNotExist.vim'
2982 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002983 v9.CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002984enddef
2985
2986" test disassembling an auto-loaded function starting with "debug"
2987def Test_vim9_autoload_disass()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002988 mkdir('Xdasdir/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002989 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002990 exe 'set rtp^=' .. getcwd() .. '/Xdasdir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002991
2992 var lines =<< trim END
2993 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002994 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002995 return 'debug'
2996 enddef
2997 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002998 writefile(lines, 'Xdasdir/autoload/debugit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002999
3000 lines =<< trim END
3001 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003002 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00003003 return 'profile'
3004 enddef
3005 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003006 writefile(lines, 'Xdasdir/autoload/profileit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003007
3008 lines =<< trim END
3009 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003010 assert_equal('debug', debugit#Test())
3011 disass debugit#Test
3012 assert_equal('profile', profileit#Test())
3013 disass profileit#Test
Bram Moolenaar160aa862022-01-10 21:29:57 +00003014 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003015 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00003016
Bram Moolenaar160aa862022-01-10 21:29:57 +00003017 &rtp = save_rtp
3018enddef
3019
3020" test using a vim9script that is auto-loaded from an autocmd
3021def Test_vim9_aucmd_autoload()
3022 var lines =<< trim END
3023 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003024 export def Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00003025 echomsg getreg('"')
3026 enddef
3027 END
3028
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003029 mkdir('Xauldir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003030 writefile(lines, 'Xauldir/autoload/foo.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003031 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003032 exe 'set rtp^=' .. getcwd() .. '/Xauldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00003033 augroup test
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003034 autocmd TextYankPost * call foo#Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00003035 augroup END
3036
3037 normal Y
3038
3039 augroup test
3040 autocmd!
3041 augroup END
Bram Moolenaar160aa862022-01-10 21:29:57 +00003042 &rtp = save_rtp
3043enddef
3044
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003045" test using a autoloaded file that is case sensitive
3046def Test_vim9_autoload_case_sensitive()
3047 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00003048 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003049 export def CaseSensitive(): string
3050 return 'done'
3051 enddef
3052 END
3053
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003054 mkdir('Xcasedir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003055 writefile(lines, 'Xcasedir/autoload/CaseSensitive.vim')
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003056 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003057 exe 'set rtp^=' .. getcwd() .. '/Xcasedir'
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003058
3059 lines =<< trim END
3060 vim9script
3061 import autoload 'CaseSensitive.vim'
3062 assert_equal('done', CaseSensitive.CaseSensitive())
3063 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003064 v9.CheckScriptSuccess(lines)
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003065
Bram Moolenaarbfac4092022-01-16 11:12:12 +00003066 if !has('fname_case')
3067 lines =<< trim END
3068 vim9script
3069 import autoload 'CaseSensitive.vim'
3070 import autoload 'casesensitive.vim'
3071 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003072 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaarbfac4092022-01-16 11:12:12 +00003073 endif
3074
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003075 &rtp = save_rtp
3076enddef
3077
Bram Moolenaar160aa862022-01-10 21:29:57 +00003078" This was causing a crash because suppress_errthrow wasn't reset.
3079def Test_vim9_autoload_error()
3080 var lines =<< trim END
3081 vim9script
3082 def crash#func()
3083 try
3084 for x in List()
3085 endfor
3086 catch
3087 endtry
3088 g:ok = true
3089 enddef
3090 fu List()
3091 invalid
3092 endfu
3093 try
3094 alsoinvalid
3095 catch /wontmatch/
3096 endtry
3097 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003098 call mkdir('Xruntime/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003099 call writefile(lines, 'Xruntime/autoload/crash.vim')
3100
3101 # run in a separate Vim to avoid the side effects of assert_fails()
3102 lines =<< trim END
3103 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
3104 call crash#func()
3105 call writefile(['ok'], 'Xdidit')
3106 qall!
3107 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003108 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003109 g:RunVim([], [], '-S Xscript')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003110 assert_equal(['ok'], readfile('Xdidit'))
3111
3112 delete('Xdidit')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003113
3114 lines =<< trim END
3115 vim9script
3116 var foo#bar = 'asdf'
3117 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003118 v9.CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar160aa862022-01-10 21:29:57 +00003119enddef
3120
Bram Moolenaar753885b2022-08-24 16:30:36 +01003121def Test_vim9_import_symlink()
3122 if !has('unix')
3123 CheckUnix
3124 else
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003125 mkdir('Xto/plugin', 'pR')
Bram Moolenaar753885b2022-08-24 16:30:36 +01003126 var lines =<< trim END
3127 vim9script
3128 import autoload 'bar.vim'
nwounkn36b66762024-06-02 16:10:07 +02003129 def FooFunc(): string
3130 return bar.Func()
3131 enddef
3132 g:resultFunc = FooFunc()
Bram Moolenaar753885b2022-08-24 16:30:36 +01003133 g:resultValue = bar.value
3134 END
3135 writefile(lines, 'Xto/plugin/foo.vim')
3136
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003137 mkdir('Xto/autoload', 'pR')
Bram Moolenaar753885b2022-08-24 16:30:36 +01003138 lines =<< trim END
3139 vim9script
3140 export def Func(): string
3141 return 'func'
3142 enddef
3143 export var value = 'val'
3144 END
3145 writefile(lines, 'Xto/autoload/bar.vim')
3146
3147 var save_rtp = &rtp
3148 &rtp = getcwd() .. '/Xfrom'
3149 system('ln -s ' .. getcwd() .. '/Xto Xfrom')
3150
3151 source Xfrom/plugin/foo.vim
3152 assert_equal('func', g:resultFunc)
3153 assert_equal('val', g:resultValue)
3154
3155 var infoTo = getscriptinfo()->filter((_, v) => v.name =~ 'Xto/autoload/bar')
3156 var infoFrom = getscriptinfo()->filter((_, v) => v.name =~ 'Xfrom/autoload/bar')
3157 assert_equal(1, len(infoTo))
3158 assert_equal(1, len(infoFrom))
3159 assert_equal(infoTo[0].sid, infoFrom[0].sourced)
Bram Moolenaar7ea9fcb2022-08-24 17:46:12 +01003160 var output: string
3161 redir => output
3162 scriptnames
3163 redir END
3164 assert_match(infoFrom[0].sid .. '->' .. infoFrom[0].sourced .. '.*Xfrom', output)
Bram Moolenaar753885b2022-08-24 16:30:36 +01003165
3166 unlet g:resultFunc
3167 unlet g:resultValue
3168 &rtp = save_rtp
Bram Moolenaar753885b2022-08-24 16:30:36 +01003169 delete('Xfrom', 'rf')
Ernie Rael9a901792024-04-16 22:11:56 +02003170
3171 # Access item from :def imported through symbolic linked directory. #14536
3172 mkdir('Xto/real_dir', 'pR')
3173 lines =<< trim END
3174 vim9script
3175 export const val = 17
3176 export def F(): number
3177 return 23
3178 enddef
3179 END
3180 writefile(lines, 'Xto/real_dir/real_file.vim')
3181 system('ln -s real_dir Xto/syml_dir')
3182 defer delete('Xto/syml_dir')
3183 lines =<< trim END
3184 vim9script
3185 import autoload './Xto/syml_dir/real_file.vim'
3186
3187 def Fmain()
3188 assert_equal(17, real_file.val)
3189 enddef
3190 def F2()
3191 assert_equal(23, real_file.F())
3192 enddef
3193 Fmain()
3194 F2()
3195 END
3196 v9.CheckScriptSuccess(lines)
Bram Moolenaar753885b2022-08-24 16:30:36 +01003197 endif
3198enddef
3199
LemonBoy90c27b22023-08-27 19:28:15 +02003200def Test_export_in_conditional_block()
3201 var lines =<< trim END
3202 vim9script
3203 if exists('this_will_fail')
3204 export var MyVar = "hello"
3205 endif
3206 END
3207 v9.CheckScriptSuccess(lines)
3208enddef
3209
Yegappan Lakshmananfa630082024-03-10 19:22:38 +01003210" Import fails when an autoloaded script is imported again.
3211" Github issue #14171
3212def Test_import_autloaded_script()
3213 mkdir('Ximporttwice', 'pR')
3214 mkdir('Ximporttwice/plugin')
3215 mkdir('Ximporttwice/autoload')
3216 var save_rtp = &rtp
3217 exe 'set rtp^=' .. getcwd() .. '/Ximporttwice'
3218
3219 var lines =<< trim END
3220 vim9script
3221
3222 export def H(): number
3223 return 10
3224 enddef
3225 END
3226 writefile(lines, 'Ximporttwice/autoload/hello.vim')
3227
3228 lines =<< trim END
3229 vim9script
3230
3231 import "./hello.vim"
3232 export def W(): number
3233 return 20
3234 enddef
3235 END
3236 writefile(lines, 'Ximporttwice/autoload/world.vim')
3237
3238 lines =<< trim END
3239 vim9script
3240
3241 import autoload '../autoload/hello.vim'
3242 import autoload '../autoload/world.vim'
3243
3244 command Hello echo hello.H()
3245 command World echo world.W()
3246 END
3247 writefile(lines, 'Ximporttwice/plugin/main.vim')
3248
3249 lines =<< trim END
3250 vim9script
3251
3252 source ./Ximporttwice/plugin/main.vim
3253 assert_equal(['20'], execute('World')->split("\n"))
3254 END
3255 v9.CheckScriptSuccess(lines)
3256
3257 &rtp = save_rtp
3258enddef
Bram Moolenaard8448622022-01-07 21:39:52 +00003259
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02003260" Test for autoloading an imported dict func
3261def Test_autoload_import_dict_func()
3262 mkdir('Xdir/autoload', 'pR')
3263 var lines =<< trim END
3264 vim9script
3265 export var al_exported_nr: number = 33
3266 def Al_AddNum(n: number)
3267 al_exported_nr += n
3268 enddef
3269 export var al_exportedDict: dict<func> = {Fn: Al_AddNum}
3270 END
3271 writefile(lines, 'Xdir/autoload/Xdictfunc.vim')
3272
3273 var save_rtp = &rtp
3274 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3275 lines =<< trim END
3276 import './Xdir/autoload/Xdictfunc.vim'
3277 call Xdictfunc#al_exportedDict.Fn(5)
3278 call assert_equal(38, Xdictfunc#al_exported_nr)
3279 call call(Xdictfunc#al_exportedDict.Fn, [3])
3280 call assert_equal(41, Xdictfunc#al_exported_nr)
3281 END
3282 v9.CheckScriptSuccess(lines)
3283 &rtp = save_rtp
3284enddef
3285
Yegappan Lakshmanan9937d8b2024-05-08 20:24:33 +02003286" Test for changing the value of an imported Dict item
3287def Test_set_imported_dict_item()
3288 var lines =<< trim END
3289 vim9script
3290 export var dict1: dict<bool> = {bflag: false}
3291 export var dict2: dict<dict<bool>> = {x: {bflag: false}}
3292 END
3293 writefile(lines, 'XimportedDict.vim', 'D')
3294
3295 lines =<< trim END
3296 vim9script
3297 import './XimportedDict.vim'
3298 assert_equal(XimportedDict.dict1.bflag, false)
3299 XimportedDict.dict1.bflag = true
3300 assert_equal(XimportedDict.dict1.bflag, true)
3301 XimportedDict.dict2.x.bflag = true
3302 assert_equal(XimportedDict.dict2.x.bflag, true)
3303 assert_equal('bool', typename(XimportedDict.dict1.bflag))
3304 assert_equal('bool', typename(XimportedDict.dict2.x.bflag))
3305 assert_equal('bool', typename(XimportedDict.dict2['x'].bflag))
3306 assert_equal('bool', typename(XimportedDict.dict2.x['bflag']))
3307
3308 assert_equal(XimportedDict.dict1['bflag'], true)
3309 XimportedDict.dict1['bflag'] = false
3310 assert_equal(XimportedDict.dict1.bflag, false)
3311 XimportedDict.dict2['x']['bflag'] = false
3312 assert_equal(XimportedDict.dict2['x'].bflag, false)
3313 END
3314 v9.CheckScriptSuccess(lines)
3315
3316 lines =<< trim END
3317 vim9script
3318 import './XimportedDict.vim'
3319 XimportedDict.dict2.x.bflag = []
3320 END
3321 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected bool but got list<any>', 3)
3322enddef
3323
3324" Test for changing the value of an imported class member
3325def Test_set_imported_class_member()
3326 var lines =<< trim END
3327 vim9script
3328 export class Config
3329 public static var option = false
3330 endclass
3331 END
3332 writefile(lines, 'XimportedClass.vim', 'D')
3333
3334 lines =<< trim END
3335 vim9script
3336 import './XimportedClass.vim' as foo
3337 type FooConfig = foo.Config
3338 assert_equal(false, FooConfig.option)
3339 assert_equal(false, foo.Config.option)
3340 foo.Config.option = true
3341 assert_equal(true, foo.Config.option)
3342 assert_equal(true, FooConfig.option)
3343 END
3344 v9.CheckScriptSuccess(lines)
3345enddef
3346
Yegappan Lakshmanan8c35c262024-05-10 13:10:54 +02003347" Test for using an imported function from the vimrc file.  The function is
3348" defined in the 'start' directory of a package.
3349def Test_import_from_vimrc()
3350 mkdir('Ximport/pack/foobar/start/foo/autoload', 'pR')
3351 var lines =<< trim END
3352 vim9script
3353 export def Foo()
3354 writefile(['Foo called'], 'Xoutput.log')
3355 enddef
3356 END
3357 writefile(lines, 'Ximport/pack/foobar/start/foo/autoload/foo.vim')
3358 lines =<< trim END
3359 vim9script
3360 set packpath+=./Ximport
3361 try
3362 import autoload 'foo.vim'
3363 foo.Foo()
3364 catch
3365 writefile(['Failed to import foo.vim'], 'Xoutput.log')
3366 endtry
3367 qall!
3368 END
3369 writefile(lines, 'Xvimrc', 'D')
3370 g:RunVim([], [], '-u Xvimrc')
3371 assert_equal(['Foo called'], readfile('Xoutput.log'))
3372 delete('Xoutput.log')
3373enddef
3374
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02003375" Test for changing a locked imported variable
3376def Test_import_locked_var()
3377 var lines =<< trim END
3378 vim9script
3379 export var Foo: number = 10
3380 lockvar Foo
3381 END
3382 writefile(lines, 'Ximportlockedvar.vim', 'D')
3383 lines =<< trim END
3384 vim9script
3385 import './Ximportlockedvar.vim' as Bar
3386 Bar.Foo = 20
3387 END
3388 v9.CheckScriptFailure(lines, 'E741: Value is locked: Foo', 3)
3389enddef
3390
Yegappan Lakshmanand79ea472025-01-20 21:09:13 +01003391" Test for using an autoload imported class as the function return type
3392def Test_imported_class_as_def_func_rettype()
3393 var lines =<< trim END
3394 vim9script
3395
3396 export class Foo
3397 var name: string = "foo"
3398 endclass
3399 END
3400 writefile(lines, 'Ximportclassrettype1.vim', 'D')
3401
3402 lines =<< trim END
3403 vim9script
3404
3405 import autoload "./Ximportclassrettype1.vim" as A
3406
3407 export def CreateFoo(): A.Foo
3408 return A.Foo.new()
3409 enddef
3410 END
3411 writefile(lines, 'Ximportclassrettype2.vim', 'D')
3412
3413 lines =<< trim END
3414 vim9script
3415
3416 import './Ximportclassrettype2.vim' as B
3417
3418 var foo = B.CreateFoo()
3419 assert_equal('foo', foo.name)
3420 END
3421 v9.CheckScriptSuccess(lines)
3422enddef
3423
Hirohito Higashi645a4282025-02-09 16:41:23 +01003424" Test for don't crash when using a combination of import and class extends
3425def Test_vim9_import_and_class_extends()
3426 var lines =<< trim END
3427 vim9script
3428 import './cccc.vim'
3429 export class Property extends cccc.Run
3430 public var value: string
3431 def new(this.value)
3432 cccc.Run.value2 = this.value
3433 enddef
3434 endclass
3435 END
3436 writefile(lines, './aaaa.vim', 'D')
3437
3438 lines =<< trim END
3439 vim9script
3440 export class Run
3441 public var value2: string
3442 def new(this.value)
3443 enddef
3444 endclass
3445 END
3446 writefile(lines, './cccc.vim', 'D')
3447
3448 lines =<< trim END
3449 vim9script
3450 import './aaaa.vim'
3451 class View
3452 var content = aaaa.Property.new('')
3453 endclass
3454
3455 var myView = View.new('This should be ok')
3456 assert_equal('This should be ok', myView.content.value)
3457 END
Yegappan Lakshmanan54d7f182025-02-10 21:35:07 +01003458 v9.CheckScriptFailure(lines, 'E1376: Object variable "value2" accessible only using class "Run" object', 2)
Hirohito Higashi645a4282025-02-09 16:41:23 +01003459enddef
3460
Hirohito Higashibf7c88d2025-02-13 21:04:07 +01003461" Test for import and class extends
3462def Test_vim9_import_and_class_extends_2()
3463 mkdir('import', 'R')
3464 var save_rtp = &rtp
3465 &rtp = getcwd()
3466
3467 var lines =<< trim END
3468 vim9script
3469 export class Property
3470 public var value: string
3471 endclass
3472 END
3473 writefile(lines, './import/libproperty.vim')
3474
3475 lines =<< trim END
3476 vim9script
3477 import 'libproperty.vim'
3478 export class View
3479 var _content = libproperty.Property.new('')
3480 endclass
3481 END
3482 writefile(lines, './import/libview.vim')
3483
3484 lines =<< trim END
3485 vim9script
3486 import 'libview.vim'
3487 class MyView extends libview.View
3488 def new(value: string)
3489 this._content.value = value
3490 enddef
3491 endclass
3492 var myView = MyView.new('This should be ok')
3493 END
3494 v9.CheckScriptSuccess(lines)
3495 &rtp = save_rtp
3496enddef
3497
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003498" Test for using an imported class as a type
3499def Test_use_imported_class_as_type()
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003500 mkdir('Xdir', 'R')
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003501 mkdir('Xdir/autoload', 'D')
3502 mkdir('Xdir/import', 'D')
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003503 var lines =<< trim END
3504 vim9script
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003505 export class B
3506 var foo: string
3507 def new()
3508 this.foo = 'bar'
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003509 enddef
3510 endclass
3511 END
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003512 writefile(lines, 'Xdir/autoload/b.vim')
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003513
3514 lines =<< trim END
3515 vim9script
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003516 import autoload '../autoload/b.vim'
3517 export class A
3518 final AO: b.B = b.B.new()
3519 endclass
3520 var a = A.new()
3521 assert_equal('bar', a.AO.foo)
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003522 END
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003523 writefile(lines, 'Xdir/import/a.vim')
3524 source Xdir/import/a.vim
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003525enddef
3526
Yegappan Lakshmanane9ae35f2025-02-27 19:12:00 +01003527" Test for using an autoloaded class from another autoloaded script
3528def Test_class_from_auloaded_script()
3529 mkdir('Xdir', 'R')
3530 var save_rtp = &rtp
3531 &rtp = getcwd()
3532 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3533
3534 mkdir('Xdir/autoload/SomeClass/bar', 'p')
3535
3536 var lines =<< trim END
3537 vim9script
3538
3539 export class Baz
3540 static var v1: string = "v1"
3541 var v2: string = "v2"
3542 def GetName(): string
3543 return "baz"
3544 enddef
3545 endclass
3546 END
3547 writefile(lines, 'Xdir/autoload/SomeClass/bar/baz.vim', 'D')
3548
3549 lines =<< trim END
3550 vim9script
3551
3552 import autoload './bar/baz.vim'
3553
3554 export def MyTestFoo(): string
3555 assert_fails('var x = baz.Baz.NonExisting()', 'E1325: Method "NonExisting" not found in class "Baz"')
3556 assert_fails('var x = baz.Baz.foobar', 'E1337: Class variable "foobar" not found in class "Baz"')
3557
3558 const instance = baz.Baz.new()
3559 return $'{instance.GetName()} {baz.Baz.v1} {instance.v2}'
3560 enddef
3561 END
3562 writefile(lines, 'Xdir/autoload/SomeClass/foo.vim', 'D')
3563
3564 lines =<< trim END
3565 vim9script
3566
3567 import autoload 'SomeClass/foo.vim'
3568 import autoload 'SomeClass/bar/baz.vim'
3569
3570 def NotInAutoload()
3571 # Use non-existing class method and variable
3572 assert_fails('var x = baz.Baz.NonExisting()', 'E1325: Method "NonExisting" not found in class "Baz"')
3573
3574 var caught_exception = false
3575 try
3576 var x = baz.Baz.foobar
3577 catch /E1337: Class variable "foobar" not found in class "Baz"/
3578 caught_exception = true
3579 endtry
3580 assert_true(caught_exception)
3581
3582 const instance = baz.Baz.new()
3583 assert_equal("baz v1 v2", $'{instance.GetName()} {baz.Baz.v1} {instance.v2}')
3584 enddef
3585
3586 def InAutoload()
3587 assert_equal("baz v1 v2", foo.MyTestFoo())
3588 enddef
3589
3590 NotInAutoload()
3591 InAutoload()
3592 END
3593 v9.CheckScriptSuccess(lines)
3594
3595 &rtp = save_rtp
3596enddef
3597
3598" Test for using an autoloaded enum from another script
3599def Test_enum_from_auloaded_script()
3600 mkdir('Xdir', 'R')
3601 var save_rtp = &rtp
3602 &rtp = getcwd()
3603 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3604
3605 mkdir('Xdir/autoload/', 'p')
3606
3607 var lines =<< trim END
3608 vim9script
3609 export enum Color
3610 Red,
3611 Green,
3612 Blue
3613 endenum
3614 END
3615 writefile(lines, 'Xdir/autoload/color.vim', 'D')
3616
3617 lines =<< trim END
3618 vim9script
3619
3620 import autoload 'color.vim'
3621
3622 def CheckColor()
3623 var c = color.Color.Green
3624 assert_equal('Green', c.name)
3625 enddef
3626 CheckColor()
3627 END
3628 v9.CheckScriptSuccess(lines)
3629
3630 &rtp = save_rtp
3631enddef
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003632
Yegappan Lakshmanan16f2d3a2025-02-24 19:23:43 +01003633" Test for using a non-exported constant as an instance variable initiazer in an
3634" imported class
3635def Test_import_member_initializer()
3636 var lines =<< trim END
3637 vim9script
3638 const DEFAULT = 'default'
3639 export class Foo
3640 public var x = DEFAULT
3641 endclass
3642 END
3643 writefile(lines, 'Ximportclass.vim', 'D')
3644
3645 # The initializer for Foo.x is evaluated in the context of Ximportclass.vim.
3646 lines =<< trim END
3647 vim9script
3648 import './Ximportclass.vim' as X
3649 class Bar extends X.Foo
3650 endclass
3651 var o = Bar.new()
3652 assert_equal('default', o.x)
3653 END
3654 v9.CheckScriptSuccess(lines)
3655
3656 # Another test
3657 lines =<< trim END
3658 vim9script
3659
3660 export interface IObjKey
3661 var unique_object_id: string
3662 endinterface
3663
3664 # helper sub-class.
3665 export class ObjKey implements IObjKey
3666 const unique_object_id = GenerateKey()
3667 endclass
3668
3669 export def GenerateKey(): string
3670 return "SomeKey"
3671 enddef
3672 END
3673 writefile(lines, 'XobjKey.vim', 'D')
3674
3675 lines =<< trim END
3676 vim9script
3677
3678 import "./XobjKey.vim" as obj_key
3679
3680 const GenKey = obj_key.GenerateKey
3681
3682 class LocalObjKey implements obj_key.IObjKey
3683 const unique_object_id = GenKey()
3684 endclass
3685
3686 type Key1 = obj_key.ObjKey
3687 type Key2 = LocalObjKey
3688
3689 class C1 extends Key1
3690 endclass
3691 class C2 extends Key2
3692 endclass
3693 assert_equal('SomeKey', C1.new().unique_object_id)
3694 assert_equal('SomeKey', C2.new().unique_object_id)
3695 END
3696 v9.CheckScriptSuccess(lines)
3697enddef
3698
Bram Moolenaard8448622022-01-07 21:39:52 +00003699" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker