blob: 0eeaa7f435c4e43c12edc67d908e954aef4270e5 [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
Bram Moolenaar62aec932022-01-29 21:45:34 +00004import './vim9.vim' as v9
Bram Moolenaard8448622022-01-07 21:39:52 +00005
6let s:export_script_lines =<< trim END
7 vim9script
8 var name: string = 'bob'
9 def Concat(arg: string): string
10 return name .. arg
11 enddef
12 g:result = Concat('bie')
13 g:localname = name
14
15 export const CONST = 1234
16 export var exported = 9876
17 export var exp_name = 'John'
18 export def Exported(): string
19 return 'Exported'
20 enddef
21 export def ExportedValue(): number
22 return exported
23 enddef
24 export def ExportedInc()
25 exported += 5
26 enddef
27 export final theList = [1]
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000028 export def AddSome(s: string): string
29 return s .. 'some'
30 enddef
31 export var AddRef = AddSome
Bram Moolenaard8448622022-01-07 21:39:52 +000032END
33
Bram Moolenaar62aec932022-01-29 21:45:34 +000034def s:Undo_export_script_lines()
Bram Moolenaard8448622022-01-07 21:39:52 +000035 unlet g:result
36 unlet g:localname
37enddef
38
39def Test_vim9_import_export()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +010040 writefile(s:export_script_lines, 'Xexport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +000041 var import_script_lines =<< trim END
42 vim9script
43 var dir = './'
44 var ext = ".vim"
45 import dir .. 'Xexport' .. ext as expo
46
47 g:exported1 = expo.exported
48 expo.exported += 3
49 g:exported2 = expo.exported
50 g:exported3 = expo.ExportedValue()
51
52 expo.ExportedInc()
53 g:exported_i1 = expo.exported
54 g:exported_i2 = expo.ExportedValue()
55
56 expo.exported = 11
57 g:exported_s1 = expo.exported
58 g:exported_s2 = expo.ExportedValue()
59
60 g:imported_func = expo.Exported()
61
62 def GetExported(): string
63 var local_dict = {ref: expo.Exported}
64 return local_dict.ref()
65 enddef
66 g:funcref_result = GetExported()
67
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +000068 def GetName(): string
69 return expo.exp_name .. 'son'
70 enddef
71 g:long_name = GetName()
72
Bram Moolenaard8448622022-01-07 21:39:52 +000073 g:imported_name = expo.exp_name
74 expo.exp_name ..= ' Doe'
Bram Moolenaar47036b62022-01-16 21:18:53 +000075 expo.exp_name = expo.exp_name .. ' Maar'
Bram Moolenaard8448622022-01-07 21:39:52 +000076 g:imported_name_appended = expo.exp_name
77 g:exported_later = expo.exported
78
79 expo.theList->add(2)
80 assert_equal([1, 2], expo.theList)
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000081
82 assert_equal('andthensome', 'andthen'->expo.AddSome())
83 assert_equal('awesome', 'awe'->expo.AddRef())
Bram Moolenaard8448622022-01-07 21:39:52 +000084 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +010085 writefile(import_script_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +000086 source Ximport.vim
87
88 assert_equal('bobbie', g:result)
89 assert_equal('bob', g:localname)
90 assert_equal(9876, g:exported1)
91 assert_equal(9879, g:exported2)
92 assert_equal(9879, g:exported3)
93
94 assert_equal(9884, g:exported_i1)
95 assert_equal(9884, g:exported_i2)
96
97 assert_equal(11, g:exported_s1)
98 assert_equal(11, g:exported_s2)
99 assert_equal(11, g:exported_later)
100
101 assert_equal('Exported', g:imported_func)
102 assert_equal('Exported', g:funcref_result)
103 assert_equal('John', g:imported_name)
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +0000104 assert_equal('Johnson', g:long_name)
Bram Moolenaar47036b62022-01-16 21:18:53 +0000105 assert_equal('John Doe Maar', g:imported_name_appended)
Bram Moolenaard8448622022-01-07 21:39:52 +0000106 assert_false(exists('g:name'))
107
108 Undo_export_script_lines()
109 unlet g:exported1
110 unlet g:exported2
111 unlet g:exported3
112 unlet g:exported_i1
113 unlet g:exported_i2
114 unlet g:exported_later
115 unlet g:imported_func
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +0000116 unlet g:imported_name g:long_name g:imported_name_appended
Bram Moolenaard8448622022-01-07 21:39:52 +0000117 delete('Ximport.vim')
118
119 # similar, with line breaks
120 var import_line_break_script_lines =<< trim END
121 vim9script
122 import './Xexport.vim'
123 as expo
124 g:exported = expo.exported
125 expo.exported += 7
126 g:exported_added = expo.exported
127 g:imported_func = expo.Exported()
128 END
129 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
130 source Ximport_lbr.vim
131
132 assert_equal(11, g:exported)
133 assert_equal(18, g:exported_added)
134 assert_equal('Exported', g:imported_func)
135
136 # exported script not sourced again
137 assert_false(exists('g:result'))
138 unlet g:exported
139 unlet g:exported_added
140 unlet g:imported_func
141 delete('Ximport_lbr.vim')
142
Bram Moolenaar68854a82022-01-31 18:59:13 +0000143 var import_shadows_cmdmod_lines =<< trim END
144 vim9script
145 import './Xexport.vim' as vim9
146 vim9.exp_name = 'Shadow'
147 assert_equal('Shadow', vim9.exp_name)
148 END
149 v9.CheckScriptSuccess(import_shadows_cmdmod_lines)
150
Bram Moolenaard8448622022-01-07 21:39:52 +0000151 var line_break_before_dot =<< trim END
152 vim9script
153 import './Xexport.vim' as expo
154 g:exported = expo
155 .exported
156 END
157 writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
158 assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
159 delete('Ximport_lbr_before_dot.vim')
160
161 var line_break_after_dot =<< trim END
162 vim9script
163 import './Xexport.vim' as expo
164 g:exported = expo.
165 exported
166 END
167 writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
168 assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
169 delete('Ximport_lbr_after_dot.vim')
170
171 var import_star_as_lines =<< trim END
172 vim9script
173 import './Xexport.vim' as Export
174 def UseExport()
175 g:exported_def = Export.exported
176 enddef
177 g:exported_script = Export.exported
178 assert_equal(1, exists('Export.exported'))
179 assert_equal(0, exists('Export.notexported'))
180 UseExport()
181 END
182 writefile(import_star_as_lines, 'Ximport.vim')
183 source Ximport.vim
184
185 assert_equal(18, g:exported_def)
186 assert_equal(18, g:exported_script)
187 unlet g:exported_def
188 unlet g:exported_script
189
190 var import_star_as_lines_no_dot =<< trim END
191 vim9script
192 import './Xexport.vim' as Export
193 def Func()
194 var dummy = 1
195 var imported = Export + dummy
196 enddef
197 defcompile
198 END
199 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
200 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
201
202 var import_star_as_lines_dot_space =<< trim END
203 vim9script
204 import './Xexport.vim' as Export
205 def Func()
206 var imported = Export . exported
207 enddef
208 defcompile
209 END
210 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
211 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
212
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000213 writefile(s:export_script_lines, 'Xexport2.vim')
214 var import_as_duplicated =<< trim END
Bram Moolenaard8448622022-01-07 21:39:52 +0000215 vim9script
216 import './Xexport.vim' as expo
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000217 import './Xexport2.vim' as expo
Bram Moolenaard8448622022-01-07 21:39:52 +0000218 END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000219 writefile(import_as_duplicated, 'Ximport.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000220 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000221 delete('Xexport2.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000222
223 var import_star_as_lines_script_no_dot =<< trim END
224 vim9script
225 import './Xexport.vim' as Export
226 g:imported_script = Export exported
227 END
228 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
229 assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
230
231 var import_star_as_lines_script_space_after_dot =<< trim END
232 vim9script
233 import './Xexport.vim' as Export
234 g:imported_script = Export. exported
235 END
236 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
237 assert_fails('source Ximport.vim', 'E1074:')
238
239 var import_star_as_lines_missing_name =<< trim END
240 vim9script
241 import './Xexport.vim' as Export
242 def Func()
243 var imported = Export.
244 enddef
245 defcompile
246 END
247 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
248 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
249
250 var import_star_as_lbr_lines =<< trim END
251 vim9script
252 import './Xexport.vim'
253 as Export
254 def UseExport()
255 g:exported = Export.exported
256 enddef
257 UseExport()
258 END
259 writefile(import_star_as_lbr_lines, 'Ximport.vim')
260 source Ximport.vim
261 assert_equal(18, g:exported)
262 unlet g:exported
263
264 # try to use something that exists but is not exported
265 var import_not_exported_lines =<< trim END
266 vim9script
267 import './Xexport.vim' as expo
268 echo expo.name
269 END
270 writefile(import_not_exported_lines, 'Ximport.vim')
271 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
272
273 # try to import something that is already defined
274 var import_already_defined =<< trim END
275 vim9script
276 var exported = 'something'
277 import './Xexport.vim' as exported
278 END
279 writefile(import_already_defined, 'Ximport.vim')
280 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
281
282 # try changing an imported const
283 var import_assign_to_const =<< trim END
284 vim9script
285 import './Xexport.vim' as expo
286 def Assign()
287 expo.CONST = 987
288 enddef
289 defcompile
290 END
291 writefile(import_assign_to_const, 'Ximport.vim')
292 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
293
294 # try changing an imported final
295 var import_assign_to_final =<< trim END
296 vim9script
297 import './Xexport.vim' as expo
298 def Assign()
299 expo.theList = [2]
300 enddef
301 defcompile
302 END
303 writefile(import_assign_to_final, 'Ximport.vim')
304 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
305
306 var import_no_as_lines =<< trim END
307 vim9script
308 import './Xexport.vim' name
309 END
310 writefile(import_no_as_lines, 'Ximport.vim')
311 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
312
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100313 # trailing starts with "as"
314 var import_bad_as_lines =<< trim END
315 vim9script
316 import './Xexport.vim' asname
317 END
318 writefile(import_no_as_lines, 'Ximport.vim')
319 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
320
Bram Moolenaard8448622022-01-07 21:39:52 +0000321 var import_invalid_string_lines =<< trim END
322 vim9script
323 import Xexport.vim
324 END
325 writefile(import_invalid_string_lines, 'Ximport.vim')
326 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
327
328 var import_wrong_name_lines =<< trim END
329 vim9script
330 import './XnoExport.vim'
331 END
332 writefile(import_wrong_name_lines, 'Ximport.vim')
333 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
334
335 var import_redefining_lines =<< trim END
336 vim9script
337 import './Xexport.vim' as exported
338 var exported = 5
339 END
340 writefile(import_redefining_lines, 'Ximport.vim')
341 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
342
Bram Moolenaar160aa862022-01-10 21:29:57 +0000343 var import_missing_dot_lines =<< trim END
344 vim9script
345 import './Xexport.vim' as expo
346 def Test()
347 expo = 9
348 enddef
349 defcompile
350 END
351 writefile(import_missing_dot_lines, 'Ximport.vim')
352 assert_fails('source Ximport.vim', 'E1258:', '', 1)
353
354 var import_missing_name_lines =<< trim END
355 vim9script
356 import './Xexport.vim' as expo
357 def Test()
358 expo.99 = 9
359 enddef
360 defcompile
361 END
362 writefile(import_missing_name_lines, 'Ximport.vim')
Bram Moolenaar76283822022-01-10 21:39:03 +0000363 assert_fails('source Ximport.vim', 'E1259:', '', 1)
Bram Moolenaar160aa862022-01-10 21:29:57 +0000364
Bram Moolenaard8448622022-01-07 21:39:52 +0000365 var import_assign_wrong_type_lines =<< trim END
366 vim9script
367 import './Xexport.vim' as expo
368 expo.exported = 'xxx'
369 END
370 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
371 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
372
373 var import_assign_const_lines =<< trim END
374 vim9script
375 import './Xexport.vim' as expo
376 expo.CONST = 4321
377 END
378 writefile(import_assign_const_lines, 'Ximport.vim')
379 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
380
Bram Moolenaard8448622022-01-07 21:39:52 +0000381 # Check that in a Vim9 script 'cpo' is set to the Vim default.
382 # Flags added or removed are also applied to the restored value.
383 set cpo=abcd
384 var lines =<< trim END
385 vim9script
386 g:cpo_in_vim9script = &cpo
387 set cpo+=f
388 set cpo-=c
389 g:cpo_after_vim9script = &cpo
390 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100391 writefile(lines, 'Xvim9_script', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000392 source Xvim9_script
393 assert_equal('fabd', &cpo)
394 set cpo&vim
395 assert_equal(&cpo, g:cpo_in_vim9script)
396 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
397 assert_equal(newcpo, g:cpo_after_vim9script)
398
399 delete('Xvim9_script')
400enddef
401
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100402def Test_import_very_long_name()
403 var lines =<< trim END
404 vim9script
405
406 export var verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname = 'asdf'
407 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100408 writefile(lines, 'Xverylong.vim', 'D')
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100409
410 lines =<< trim END
411 vim9script
412 import './Xverylong.vim'
413
414 g:result = Xverylong.verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname
415 END
416 v9.CheckScriptSuccess(lines)
417 assert_equal('asdf', g:result)
418
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100419 unlet g:result
420enddef
421
Bram Moolenaard8448622022-01-07 21:39:52 +0000422def Test_import_funcref()
423 var lines =<< trim END
424 vim9script
425 export def F(): number
426 return 42
427 enddef
428 export const G = F
429 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100430 writefile(lines, 'Xlib.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000431
432 lines =<< trim END
433 vim9script
434 import './Xlib.vim' as lib
435 const Foo = lib.G()
436 assert_equal(42, Foo)
437
438 def DoTest()
439 const Goo = lib.G()
440 assert_equal(42, Goo)
441 enddef
442 DoTest()
443 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000444 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000445enddef
446
Bram Moolenaar5ab30012022-10-07 17:26:22 +0100447def Test_export_closure()
448 # tests that the closure in block can be compiled, not the import part
449 var lines =<< trim END
450 vim9script
451 {
452 var foo = 42
453 export def Bar(): number
454 return foo
455 enddef
456 }
457 assert_equal(42, Bar())
458 END
459 v9.CheckScriptSuccess(lines)
460enddef
461
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000462def Test_import_duplicate_function()
463 # Function Hover() exists in both scripts, partial should refer to the right
464 # one.
465 var lines =<< trim END
466 vim9script
467
468 def Hover(d: dict<any>): string
469 return 'found it'
470 enddef
471
472 export def NewLspServer(): dict<any>
473 var d: dict<any> = {}
474 d->extend({hover: function('Hover', [d])})
475 return d
476 enddef
477
478 NewLspServer()
479 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100480 writefile(lines, 'Xserver.vim', 'D')
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000481
482 lines =<< trim END
483 vim9script
484
485 import './Xserver.vim' as server
486
487 export def Hover()
488 enddef
489
490 def AddServer()
491 var d: dict<any> = server.NewLspServer()
492 assert_equal('found it', d.hover())
493 enddef
494 AddServer()
495 END
496 v9.CheckScriptSuccess(lines)
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000497enddef
498
499
Bram Moolenaard8448622022-01-07 21:39:52 +0000500def Test_import_fails()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100501 writefile([], 'Xfoo.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000502 var lines =<< trim END
503 import './Xfoo.vim' as foo
504 foo = 'bar'
505 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000506 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
Bram Moolenaard8448622022-01-07 21:39:52 +0000507 lines =<< trim END
508 vim9script
509 import './Xfoo.vim' as foo
510 var that = foo
511 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000512 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000513 lines =<< trim END
514 vim9script
515 import './Xfoo.vim' as foo
516 var that: any
517 that += foo
518 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000519 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000520 lines =<< trim END
521 vim9script
522 import './Xfoo.vim' as foo
523 foo += 9
524 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000525 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaard8448622022-01-07 21:39:52 +0000526
527 lines =<< trim END
528 vim9script
529 import './Xfoo.vim' as 9foo
530 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000531 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000532 lines =<< trim END
533 vim9script
534 import './Xfoo.vim' as the#foo
535 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000536 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000537 lines =<< trim END
538 vim9script
539 import './Xfoo.vim' as g:foo
540 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000541 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000542
Bram Moolenaard8448622022-01-07 21:39:52 +0000543 lines =<< trim END
544 vim9script
545 def TheFunc()
546 echo 'the func'
547 enddef
548 export var Ref = TheFunc
549 END
550 writefile([], 'Xthat.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000551
Bram Moolenaard8448622022-01-07 21:39:52 +0000552 lines =<< trim END
553 import './Xthat.vim' as That
554 That()
555 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000556 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000557
558 lines =<< trim END
Bram Moolenaar937610b2022-01-19 17:21:29 +0000559 vim9script
560 import './Xthat.vim' as That
561 def Func()
562 echo That()
563 enddef
564 Func()
565 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000566 v9.CheckScriptFailure(lines, 'E1236: Cannot use That itself')
Bram Moolenaar937610b2022-01-19 17:21:29 +0000567
568 lines =<< trim END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000569 import './Xthat.vim' as one
570 import './Xthat.vim' as two
571 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000572 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000573
574 delete('Xthat.vim')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000575
576 lines =<< trim END
577 vim9script
578 export var item = 'hello'
579 import './Xyourself.vim'
580 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100581 writefile(lines, 'Xyourself.vim', 'D')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000582 assert_fails('source Xyourself.vim', 'E1088:')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000583
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100584 mkdir('Ximport', 'R')
Bram Moolenaard8448622022-01-07 21:39:52 +0000585
586 writefile(['vim9script'], 'Ximport/.vim')
587 lines =<< trim END
588 vim9script
589 import './Ximport/.vim'
590 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000591 v9.CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
Bram Moolenaard8448622022-01-07 21:39:52 +0000592 lines =<< trim END
593 vim9script
594 import './Ximport/.vim' as vim
595 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000596 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000597
598 writefile(['vim9script'], 'Ximport/.vimrc')
599 lines =<< trim END
600 vim9script
601 import './Ximport/.vimrc'
602 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000603 v9.CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000604 lines =<< trim END
605 vim9script
606 import './Ximport/.vimrc' as vimrc
607 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000608 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000609
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100610 new
611 setline(1, ['vim9script', 'import "" as abc'])
612 assert_fails('source', 'E1071: Invalid string for :import: "" as abc')
613 setline(2, 'import [] as abc')
614 assert_fails('source', 'E1071: Invalid string for :import: [] as abc')
615 setline(2, 'import test_null_string() as abc')
616 assert_fails('source', 'E1071: Invalid string for :import: test_null_string() as abc')
617 bw!
618 call writefile(['vim9script', "import './Xfoo.vim' ask expo"], 'Xbar.vim')
619 assert_fails('source Xbar.vim', 'E488: Trailing characters: ask expo')
620 writefile([], 'Xtemp')
621 call writefile(['vim9script', "import './Xtemp'"], 'Xbar.vim')
622 assert_fails('source Xbar.vim', 'E1257: Imported script must use "as" or end in .vim: Xtemp')
623 delete('Xtemp')
624 call writefile(['vim9script', "import './Xfoo.vim' as abc | foobar"], 'Xbar.vim')
625 assert_fails('source Xbar.vim', 'E492: Not an editor command: foobar')
626 call delete('Xbar.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000627enddef
628
629func g:Trigger()
630 source Ximport.vim
631 return "echo 'yes'\<CR>"
632endfunc
633
634def Test_import_export_expr_map()
635 # check that :import and :export work when buffer is locked
636 var export_lines =<< trim END
637 vim9script
638 export def That(): string
639 return 'yes'
640 enddef
641 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100642 writefile(export_lines, 'Xexport_that.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000643
644 var import_lines =<< trim END
645 vim9script
646 import './Xexport_that.vim' as that
647 assert_equal('yes', that.That())
648 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100649 writefile(import_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000650
651 nnoremap <expr> trigger g:Trigger()
652 feedkeys('trigger', "xt")
653
Bram Moolenaard8448622022-01-07 21:39:52 +0000654 nunmap trigger
655enddef
656
657def Test_import_in_filetype()
John Marriott45377e22025-03-27 18:12:32 +0100658 CheckFeature quickfix
Bram Moolenaard8448622022-01-07 21:39:52 +0000659 # check that :import works when the buffer is locked
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100660 mkdir('ftplugin', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +0000661 var export_lines =<< trim END
662 vim9script
663 export var That = 'yes'
664 END
665 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
666
667 var import_lines =<< trim END
668 vim9script
669 import './Xexport_ft.vim' as ft
670 assert_equal('yes', ft.That)
671 g:did_load_mytpe = 1
672 END
673 writefile(import_lines, 'ftplugin/qf.vim')
674
675 var save_rtp = &rtp
676 &rtp = getcwd() .. ',' .. &rtp
677
678 filetype plugin on
679 copen
680 assert_equal(1, g:did_load_mytpe)
681
682 quit!
Bram Moolenaard8448622022-01-07 21:39:52 +0000683 &rtp = save_rtp
684enddef
685
686def Test_use_import_in_mapping()
687 var lines =<< trim END
688 vim9script
Bram Moolenaar89445512022-04-14 12:58:23 +0100689 export def Funcx(nr: number)
690 g:result = nr
Bram Moolenaard8448622022-01-07 21:39:52 +0000691 enddef
692 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100693 writefile(lines, 'XsomeExport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000694 lines =<< trim END
695 vim9script
696 import './XsomeExport.vim' as some
697 var Funcy = some.Funcx
Bram Moolenaar89445512022-04-14 12:58:23 +0100698 nnoremap <F3> :call <sid>Funcy(42)<cr>
699 nnoremap <F4> :call <sid>some.Funcx(44)<cr>
Bram Moolenaard8448622022-01-07 21:39:52 +0000700 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100701 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000702
703 source Xmapscript.vim
704 feedkeys("\<F3>", "xt")
705 assert_equal(42, g:result)
Bram Moolenaar89445512022-04-14 12:58:23 +0100706 feedkeys("\<F4>", "xt")
707 assert_equal(44, g:result)
Bram Moolenaard8448622022-01-07 21:39:52 +0000708
709 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +0000710 nunmap <F3>
Bram Moolenaar89445512022-04-14 12:58:23 +0100711 nunmap <F4>
712enddef
713
Bram Moolenaar648dd882022-04-14 21:36:15 +0100714def Test_use_relative_autoload_import_in_mapping()
Bram Moolenaar89445512022-04-14 12:58:23 +0100715 var lines =<< trim END
716 vim9script
717 export def Func()
718 g:result = 42
719 enddef
720 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100721 writefile(lines, 'XrelautoloadExport.vim', 'D')
Bram Moolenaar89445512022-04-14 12:58:23 +0100722 lines =<< trim END
723 vim9script
Bram Moolenaar648dd882022-04-14 21:36:15 +0100724 import autoload './XrelautoloadExport.vim' as some
Bram Moolenaar89445512022-04-14 12:58:23 +0100725 nnoremap <F3> :call <SID>some.Func()<CR>
726 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100727 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaar89445512022-04-14 12:58:23 +0100728
729 source Xmapscript.vim
Bram Moolenaar648dd882022-04-14 21:36:15 +0100730 assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100731 var l = getscriptinfo()
732 assert_match('XrelautoloadExport.vim$', l[-1].name)
733 assert_true(l[-1].autoload)
Bram Moolenaar89445512022-04-14 12:58:23 +0100734 feedkeys("\<F3>", "xt")
735 assert_equal(42, g:result)
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100736 l = getscriptinfo({name: 'XrelautoloadExport'})
737 assert_true(len(l) == 1)
738 assert_match('XrelautoloadExport.vim$', l[0].name)
739 assert_false(l[0].autoload)
Yegappan Lakshmanan2f892d82022-08-28 18:52:10 +0100740 assert_equal(999999, l[0].version)
Bram Moolenaar89445512022-04-14 12:58:23 +0100741
742 unlet g:result
Bram Moolenaar89445512022-04-14 12:58:23 +0100743 nunmap <F3>
Bram Moolenaard8448622022-01-07 21:39:52 +0000744enddef
745
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100746def Test_autoload_import_var()
747 # variable name starts with "autoload"
748 var lines =<< trim END
749 vim9script
750 var autoloaded = "Xtest.vim"
751 import autoloaded
752 END
753 v9.CheckScriptFailure(lines, 'E1053: Could not import "Xtest.vim')
754enddef
755
Bram Moolenaar648dd882022-04-14 21:36:15 +0100756def Test_use_autoload_import_in_mapping()
757 var lines =<< trim END
758 vim9script
759 export def Func()
760 g:result = 49
761 enddef
762 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100763 mkdir('Ximpdir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100764 writefile(lines, 'Ximpdir/autoload/XautoloadExport.vim')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100765 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100766 exe 'set rtp^=' .. getcwd() .. '/Ximpdir'
Bram Moolenaar648dd882022-04-14 21:36:15 +0100767
768 lines =<< trim END
769 vim9script
770 import autoload 'XautoloadExport.vim' as some
771 nnoremap <F3> :call <SID>some.Func()<CR>
772 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100773 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100774
775 source Xmapscript.vim
776 assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
777 feedkeys("\<F3>", "xt")
778 assert_equal(49, g:result)
779
780 unlet g:result
Bram Moolenaar648dd882022-04-14 21:36:15 +0100781 nunmap <F3>
Bram Moolenaar648dd882022-04-14 21:36:15 +0100782 &rtp = save_rtp
783enddef
784
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000785def Test_use_import_in_command_completion()
Bram Moolenaar15d16352022-01-17 20:09:08 +0000786 var lines =<< trim END
787 vim9script
788 export def Complete(..._): list<string>
789 return ['abcd']
790 enddef
791 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100792 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar15d16352022-01-17 20:09:08 +0000793
794 lines =<< trim END
795 vim9script
796 import './Xscript.vim'
797
798 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
799 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
800 assert_equal('#Cmd abcd', @:)
801 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000802 v9.CheckScriptSuccess(lines)
Bram Moolenaar15d16352022-01-17 20:09:08 +0000803
804 delcommand Cmd
Bram Moolenaar15d16352022-01-17 20:09:08 +0000805enddef
806
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100807def Test_use_import_with_funcref_in_command_completion()
808 var lines =<< trim END
809 vim9script
810 export def Complete(..._): list<string>
811 return ['abcd']
812 enddef
813 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100814 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100815
816 lines =<< trim END
817 vim9script
818 import './Xscript.vim'
819
820 var Ref = Xscript.Complete
821 exe "command -nargs=1 -complete=customlist," .. expand('<SID>') .. "Ref Cmd echo 'ok'"
822 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
823 assert_equal('#Cmd abcd', @:)
824 END
825 v9.CheckScriptSuccess(lines)
826
827 delcommand Cmd
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100828enddef
829
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000830def Test_use_autoload_import_in_insert_completion()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100831 mkdir('Xinsdir/autoload', 'pR')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000832 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100833 exe 'set rtp^=' .. getcwd() .. '/Xinsdir'
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000834
835 var lines =<< trim END
836 vim9script
837 export def ThesaurusFunc(findbase: bool, _): any
838 if findbase
839 return 1
840 endif
841 return [
842 'check',
843 'experiment',
844 'test',
845 'verification'
846 ]
847 enddef
848 g:completion_loaded = 'yes'
849 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100850 writefile(lines, 'Xinsdir/autoload/completion.vim')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000851
852 new
853 lines =<< trim END
854 vim9script
855 g:completion_loaded = 'no'
856 import autoload 'completion.vim'
857 set thesaurusfunc=completion.ThesaurusFunc
858 assert_equal('no', g:completion_loaded)
859 feedkeys("i\<C-X>\<C-T>\<C-N>\<Esc>", 'xt')
860 assert_equal('experiment', getline(1))
861 assert_equal('yes', g:completion_loaded)
862 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000863 v9.CheckScriptSuccess(lines)
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000864
865 set thesaurusfunc=
866 bwipe!
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000867 &rtp = save_rtp
868enddef
869
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000870def Test_use_autoload_import_partial_in_opfunc()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100871 mkdir('Xpartdir/autoload', 'pR')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000872 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100873 exe 'set rtp^=' .. getcwd() .. '/Xpartdir'
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000874
875 var lines =<< trim END
876 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100877 export def Opfunc1(..._)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000878 g:opfunc_called = 'yes'
879 enddef
880 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100881 writefile(lines, 'Xpartdir/autoload/opfunc.vim')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000882
883 new
884 lines =<< trim END
885 vim9script
886 import autoload 'opfunc.vim'
887 nnoremap <expr> <F3> TheFunc()
888 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100889 &operatorfunc = function('opfunc.Opfunc1', [0])
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000890 return 'g@'
891 enddef
892 feedkeys("\<F3>l", 'xt')
893 assert_equal('yes', g:opfunc_called)
894 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000895 v9.CheckScriptSuccess(lines)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000896
897 set opfunc=
898 bwipe!
Bram Moolenaar06b77222022-01-25 15:51:56 +0000899 nunmap <F3>
900 &rtp = save_rtp
901enddef
902
903def Test_set_opfunc_to_autoload_func_directly()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100904 mkdir('Xdirdir/autoload', 'pR')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000905 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100906 exe 'set rtp^=' .. getcwd() .. '/Xdirdir'
Bram Moolenaar06b77222022-01-25 15:51:56 +0000907
908 var lines =<< trim END
909 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100910 export def Opfunc2(..._)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000911 g:opfunc_called = 'yes'
912 enddef
913 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100914 writefile(lines, 'Xdirdir/autoload/opfunc.vim')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000915
916 new
917 lines =<< trim END
918 vim9script
919 import autoload 'opfunc.vim'
920 nnoremap <expr> <F3> TheFunc()
921 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100922 &operatorfunc = opfunc.Opfunc2
Bram Moolenaar06b77222022-01-25 15:51:56 +0000923 return 'g@'
924 enddef
925 feedkeys("\<F3>l", 'xt')
926 assert_equal('yes', g:opfunc_called)
927 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000928 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000929
930 set opfunc=
931 bwipe!
Bram Moolenaar06b77222022-01-25 15:51:56 +0000932 nunmap <F3>
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000933 &rtp = save_rtp
934enddef
935
Bram Moolenaare70dd112022-01-21 16:31:11 +0000936def Test_use_autoload_import_in_fold_expression()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100937 mkdir('Xfolddir/autoload', 'pR')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000938 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100939 exe 'set rtp^=' .. getcwd() .. '/Xfolddir'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000940
941 var lines =<< trim END
942 vim9script
943 export def Expr(): string
944 return getline(v:lnum) =~ '^#' ? '>1' : '1'
945 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000946 export def Text(): string
947 return 'fold text'
948 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000949 g:fold_loaded = 'yes'
950 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100951 writefile(lines, 'Xfolddir/autoload/fold.vim')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000952
953 lines =<< trim END
954 vim9script
955 import autoload 'fold.vim'
956 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000957 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000958 &foldmethod = 'expr'
959 &debug = 'throw'
960 END
961 new
962 setline(1, ['# one', 'text', '# two', 'text'])
963 g:fold_loaded = 'no'
Bram Moolenaar62aec932022-01-29 21:45:34 +0000964 v9.CheckScriptSuccess(lines)
Bram Moolenaare70dd112022-01-21 16:31:11 +0000965 assert_equal('no', g:fold_loaded)
966 redraw
967 assert_equal('yes', g:fold_loaded)
968
969 # Check that script context of 'foldexpr' is copied to another buffer.
970 edit! otherfile
971 redraw
972
Bram Moolenaar9530b582022-01-22 13:39:08 +0000973 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +0000974 bwipe!
Bram Moolenaare70dd112022-01-21 16:31:11 +0000975 &rtp = save_rtp
976enddef
977
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100978def Test_autoload_import_relative()
979 var lines =<< trim END
980 vim9script
981
982 g:loaded = 'yes'
983 export def RelFunc(): string
984 return 'relfunc'
985 enddef
986 def NotExported()
987 echo 'not'
988 enddef
989
990 export var someText = 'some text'
991 var notexp = 'bad'
992 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100993 writefile(lines, 'XimportRel.vim', 'D')
994 writefile(lines, 'XimportRel2.vim', 'D')
995 writefile(lines, 'XimportRel3.vim', 'D')
996 writefile(lines, 'XimportRel4.vim', 'D')
997 writefile(lines, 'XimportRel5.vim', 'D')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100998
999 lines =<< trim END
1000 vim9script
1001 g:loaded = 'no'
1002 import autoload './XimportRel.vim'
1003 assert_equal('no', g:loaded)
1004
1005 def AFunc(): string
1006 var res = ''
1007 res ..= XimportRel.RelFunc()
1008 res ..= '/'
1009 res ..= XimportRel.someText
1010 XimportRel.someText = 'from AFunc'
1011 return res
1012 enddef
1013 # script not loaded when compiling
1014 defcompile
1015 assert_equal('no', g:loaded)
1016
1017 assert_equal('relfunc/some text', AFunc())
1018 assert_equal('yes', g:loaded)
1019 unlet g:loaded
1020
1021 assert_equal('from AFunc', XimportRel.someText)
1022 XimportRel.someText = 'from script'
1023 assert_equal('from script', XimportRel.someText)
1024 END
1025 v9.CheckScriptSuccess(lines)
1026
1027 lines =<< trim END
1028 vim9script
1029 import autoload './XimportRel.vim'
1030 echo XimportRel.NotExported()
1031 END
1032 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 3)
1033
1034 lines =<< trim END
1035 vim9script
1036 import autoload './XimportRel.vim'
1037 echo XimportRel.notexp
1038 END
1039 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1040
1041 lines =<< trim END
1042 vim9script
1043 import autoload './XimportRel.vim'
1044 XimportRel.notexp = 'bad'
1045 END
1046 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1047
1048 lines =<< trim END
1049 vim9script
1050 import autoload './XimportRel.vim'
1051 def Func()
1052 echo XimportRel.NotExported()
1053 enddef
1054 Func()
1055 END
1056 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 1)
1057
1058 lines =<< trim END
1059 vim9script
1060 import autoload './XimportRel.vim'
1061 def Func()
1062 echo XimportRel.notexp
1063 enddef
1064 Func()
1065 END
1066 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1067
Bram Moolenaar10611952022-04-03 21:11:34 +01001068 # Same, script not imported before
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001069 lines =<< trim END
1070 vim9script
Bram Moolenaar10611952022-04-03 21:11:34 +01001071 import autoload './XimportRel4.vim'
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001072 def Func()
Bram Moolenaar10611952022-04-03 21:11:34 +01001073 echo XimportRel4.notexp
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001074 enddef
1075 Func()
1076 END
1077 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1078
Bram Moolenaar10611952022-04-03 21:11:34 +01001079 # does not fail if the script wasn't loaded yet and only compiling
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001080 g:loaded = 'no'
1081 lines =<< trim END
1082 vim9script
1083 import autoload './XimportRel2.vim'
1084 def Func()
1085 echo XimportRel2.notexp
1086 enddef
1087 defcompile
1088 END
1089 v9.CheckScriptSuccess(lines)
1090 assert_equal('no', g:loaded)
1091
Bram Moolenaar10611952022-04-03 21:11:34 +01001092 lines =<< trim END
1093 vim9script
1094 import autoload './XimportRel.vim'
1095 def Func()
1096 XimportRel.notexp = 'bad'
1097 enddef
1098 Func()
1099 END
1100 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1101
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001102 # fails with a not loaded import
1103 lines =<< trim END
1104 vim9script
1105 import autoload './XimportRel3.vim'
1106 def Func()
1107 XimportRel3.notexp = 'bad'
1108 enddef
1109 Func()
1110 END
1111 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1112 assert_equal('yes', g:loaded)
1113 unlet g:loaded
1114
Bram Moolenaar10611952022-04-03 21:11:34 +01001115 lines =<< trim END
1116 vim9script
1117 import autoload './XimportRel5.vim'
1118 def Func()
1119 XimportRel5.nosuchvar = 'bad'
1120 enddef
1121 Func()
1122 END
1123 v9.CheckScriptFailure(lines, 'E121: Undefined variable: nosuchvar', 1)
1124 unlet g:loaded
1125
1126 # nasty: delete script after compiling function
1127 writefile(['vim9script'], 'XimportRelDel.vim')
1128 lines =<< trim END
1129 vim9script
1130
1131 import autoload './XimportRelDel.vim'
1132 def DoIt()
1133 echo XimportRelDel.var
1134 enddef
1135 defcompile
1136 delete('XimportRelDel.vim')
1137 DoIt()
1138 END
Bram Moolenaar242c1522022-04-03 21:52:51 +01001139 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001140enddef
1141
Yegappan Lakshmananf135fa22024-04-20 18:31:21 +02001142" autoload relative, access from compiled function.
1143" Github issues: #14565, #14579
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001144def Test_autoload_import_relative_compiled_buffer()
Ernie Rael1433ac92024-04-17 22:36:32 +02001145 var lines =<< trim END
1146 vim9script
1147
1148 export def F1(): string
1149 return 'InFile.vim'
1150 enddef
1151 END
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001152 writefile(lines, 'Ximportrelativebuffer.vim', 'D')
Ernie Rael1433ac92024-04-17 22:36:32 +02001153 lines =<< trim END
1154 vim9script
1155
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001156 import autoload './Ximportrelativebuffer.vim' as xfile
Ernie Rael1433ac92024-04-17 22:36:32 +02001157
1158 def F(): string
1159 return xfile.F1()
1160 enddef
1161 assert_equal('InFile.vim', F())
1162 END
1163 new
1164 setline(1, lines)
1165 :source
Yegappan Lakshmananf135fa22024-04-20 18:31:21 +02001166 # source one more time to detect issues with clearing the script state and
1167 # variables
1168 :source
1169 :bw!
1170enddef
1171
1172" Test for relative import when sourcing a buffer in another directory
1173def Test_autoload_import_relative_from_buffer_in_dir()
1174 mkdir('Ximportrelative/dir1/dir2', 'pR')
1175 var lines =<< trim END
1176 vim9script
1177
1178 export def F1(): string
1179 return 'InFile.vim'
1180 enddef
1181 END
1182 writefile(lines, 'Ximportrelative/dir1/dir2/Ximport.vim')
1183 lines =<< trim END
1184 vim9script
1185
1186 import autoload './Ximport.vim' as xfile
1187
1188 def F(): string
1189 return xfile.F1()
1190 enddef
1191 assert_equal('InFile.vim', F())
1192 END
1193 writefile(lines, 'Ximportrelative/dir1/dir2/Xrelative.vim')
1194
1195 split Ximportrelative/dir1/dir2/Xrelative.vim
1196 :source
1197 # source one more time to detect issues with clearing the script state and
1198 # variables
1199 :source
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001200 :bw!
Ernie Rael1433ac92024-04-17 22:36:32 +02001201enddef
1202
Ernie Rael84f6dc72024-04-21 14:45:48 +02001203" Test modifying exported autoload variable. Github issue: #14591
1204def Test_autoload_export_variables()
1205 mkdir('Xautoload_vars/autoload', 'pR')
1206 var lines =<< trim END
1207 vim9script
Ernie Rael3f821d62024-04-24 20:07:50 +02001208 g:Xautoload_vars_autoload = true
Ernie Rael84f6dc72024-04-21 14:45:48 +02001209 export var val = 11
1210 val = 42
1211 END
1212
1213 # Test that the imported script, above, can modify the exported variable;
1214 # and test that the importing script, below, can modify the variable.
1215 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f2.vim', 'D')
1216 lines =<< trim END
1217 vim9script
Ernie Rael3f821d62024-04-24 20:07:50 +02001218 g:Xautoload_vars_autoload = false
Ernie Rael84f6dc72024-04-21 14:45:48 +02001219
1220 import autoload './Xautoload_vars/autoload/Xauto_vars_f2.vim' as f2
Ernie Rael3f821d62024-04-24 20:07:50 +02001221 # Verify that the import statement does not load the file.
1222 assert_equal(false, g:Xautoload_vars_autoload)
Ernie Rael84f6dc72024-04-21 14:45:48 +02001223
1224 def F(): number
1225 return f2.val
1226 enddef
Ernie Rael3f821d62024-04-24 20:07:50 +02001227 # Verify compile does not load the file.
1228 defcompile F
1229 assert_equal(false, g:Xautoload_vars_autoload)
1230
1231 # load the file by accessing the exported variable
Ernie Rael84f6dc72024-04-21 14:45:48 +02001232 assert_equal(42, F())
Ernie Rael3f821d62024-04-24 20:07:50 +02001233 assert_equal(true, g:Xautoload_vars_autoload)
1234 unlet g:Xautoload_vars_autoload
1235
Ernie Rael84f6dc72024-04-21 14:45:48 +02001236 assert_equal(42, f2.val)
1237 f2.val = 17
1238 assert_equal(17, f2.val)
1239
1240 def G()
1241 f2.val = 19
1242 enddef
1243 G()
1244 assert_equal(19, f2.val)
1245 END
1246 v9.CheckScriptSuccess(lines)
1247
1248 # Test const var is not modifiable.
1249 lines =<< trim END
1250 vim9script
1251 export const val = 11
1252 val = 42
1253 END
1254 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f3.vim', 'D')
1255 lines =<< trim END
1256 vim9script
1257
1258 import autoload './Xautoload_vars/autoload/Xauto_vars_f3.vim' as f3
1259
1260 var x = f3.val
1261 END
1262 v9.CheckScriptFailure(lines, 'E46:')
1263
1264 # Test const var is not modifiable from importing script.
1265 lines =<< trim END
1266 vim9script
1267 export const val = 11
1268 END
1269 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f4.vim', 'D')
1270 lines =<< trim END
1271 vim9script
1272
1273 import autoload './Xautoload_vars/autoload/Xauto_vars_f4.vim' as f4
1274
1275 f4.val = 13
1276 END
1277 v9.CheckScriptFailure(lines, 'E46:')
Ernie Rael3f821d62024-04-24 20:07:50 +02001278
1279 # Test const var is not modifiable from importing script from :def.
1280 # Github issue: #14606
1281 lines =<< trim END
1282 vim9script
1283 export const val = 11
1284 END
1285 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f5.vim', 'D')
1286 lines =<< trim END
1287 vim9script
1288
1289 import autoload './Xautoload_vars/autoload/Xauto_vars_f5.vim' as f5
1290
1291 def F()
1292 f5.val = 13
1293 enddef
1294 F()
1295 END
1296 v9.CheckScriptFailure(lines, 'E741:')
1297
1298 # Still part of Github issue: #14606
1299 lines =<< trim END
1300 vim9script
1301 export var val = 11
1302 END
1303 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f6.vim', 'D')
1304 lines =<< trim END
1305 vim9script
1306
1307 import autoload './Xautoload_vars/autoload/Xauto_vars_f6.vim' as f6
1308
1309 def F()
1310 f6.val = 13
1311 enddef
1312 F()
1313 assert_equal(13, f6.val)
1314 END
1315 v9.CheckScriptSuccess(lines)
Ernie Rael84f6dc72024-04-21 14:45:48 +02001316enddef
1317
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001318def Test_autoload_import_relative_autoload_dir()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001319 mkdir('autoload', 'pR')
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001320 var lines =<< trim END
1321 vim9script
1322 export def Bar()
1323 g:called_bar = 'yes'
1324 enddef
1325 END
1326 writefile(lines, 'autoload/script.vim')
1327
1328 lines =<< trim END
1329 vim9script
1330 import autoload './autoload/script.vim'
1331 def Foo()
1332 script.Bar()
1333 enddef
1334 Foo()
1335 assert_equal('yes', g:called_bar)
1336 END
1337 v9.CheckScriptSuccess(lines)
1338
1339 unlet g:called_bar
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001340enddef
1341
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001342def Test_autoload_import_deleted()
1343 var lines =<< trim END
1344 vim9script
1345 export const FOO = 1
1346 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001347 writefile(lines, 'Xa.vim', 'D')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001348
1349 lines =<< trim END
1350 vim9script
1351 import autoload './Xa.vim'
1352
1353 delete('Xa.vim')
1354 var x = Xa.FOO
1355 END
1356 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001357enddef
1358
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01001359def Test_autoload_import_using_const()
1360 mkdir('Xdir/autoload', 'pR')
1361 var lines =<< trim END
1362 vim9script
1363 export const FOO = 42
1364 echomsg FOO
1365 END
1366 writefile(lines, 'Xdir/autoload/exp.vim')
1367
1368 var save_rtp = &rtp
1369 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1370 lines =<< trim END
1371 vim9script
1372 import autoload 'exp.vim'
1373 assert_equal(42, exp.FOO)
1374 END
1375 v9.CheckScriptSuccess(lines)
1376 &rtp = save_rtp
1377enddef
1378
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001379func Test_import_in_diffexpr()
1380 CheckExecutable diff
1381
1382 call Run_Test_import_in_diffexpr()
1383endfunc
1384
1385def Run_Test_import_in_diffexpr()
1386 var lines =<< trim END
1387 vim9script
1388
1389 export def DiffExpr()
1390 # Prepend some text to check diff type detection
1391 writefile(['warning', ' message'], v:fname_out)
1392 silent exe '!diff ' .. v:fname_in .. ' '
1393 .. v:fname_new .. '>>' .. v:fname_out
1394 enddef
1395 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001396 writefile(lines, 'Xdiffexpr', 'D')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001397
1398 lines =<< trim END
1399 vim9script
1400 import './Xdiffexpr' as diff
1401
1402 set diffexpr=diff.DiffExpr()
1403 set diffopt=foldcolumn:0
1404 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001405 v9.CheckScriptSuccess(lines)
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001406
1407 enew!
1408 call setline(1, ['one', 'two', 'three'])
1409 diffthis
1410
1411 botright vert new
1412 call setline(1, ['one', 'two', 'three.'])
1413 diffthis
1414 # we only check if this does not cause errors
1415 redraw
1416
1417 diffoff!
Bram Moolenaar50761872022-06-26 18:01:00 +01001418 set diffexpr=
1419 set diffopt&
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001420 bwipe!
1421 bwipe!
1422enddef
1423
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001424def Test_import_in_patchexpr()
1425 var lines =<< trim END
1426 vim9script
1427 export def TPatch()
1428 call writefile(['output file'], v:fname_out)
1429 enddef
1430 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001431 writefile(lines, 'Xpatchexpr', 'D')
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001432
1433 lines =<< trim END
1434 vim9script
1435 import './Xpatchexpr' as patch
1436 set patchexpr=patch.TPatch()
1437 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001438 v9.CheckScriptSuccess(lines)
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001439
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001440 call writefile(['input file'], 'Xinput', 'D')
1441 call writefile(['diff file'], 'Xdiff', 'D')
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001442 :%bwipe!
1443 edit Xinput
1444 diffpatch Xdiff
1445 call assert_equal('output file', getline(1))
1446
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001447 set patchexpr&
1448 :%bwipe!
1449enddef
1450
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001451def Test_import_in_formatexpr()
1452 var lines =<< trim END
1453 vim9script
1454 export def MyFormatExpr(): number
1455 g:did_format = 'yes'
1456 return 0
1457 enddef
1458 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001459 writefile(lines, 'Xformatter', 'D')
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001460
1461 lines =<< trim END
1462 vim9script
1463 import './Xformatter' as format
1464 set formatexpr=format.MyFormatExpr()
1465 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001466 v9.CheckScriptSuccess(lines)
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001467
1468 new
1469 setline(1, ['a', 'b', 'c'])
1470 normal gqG
1471 assert_equal('yes', g:did_format)
1472
1473 bwipe!
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001474 unlet g:did_format
1475 set formatexpr=
1476enddef
1477
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001478def Test_import_in_includeexpr()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001479 writefile(['found it'], 'Xthisfile', 'D')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001480 new
1481
1482 var lines =<< trim END
1483 vim9script
1484 export def DoSub(): string
1485 return substitute(v:fname, 'that', 'this', '')
1486 enddef
1487 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001488 writefile(lines, 'Xinclude.vim', 'D')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001489
1490 lines =<< trim END
1491 vim9script
1492 import './Xinclude.vim'
1493 set includeexpr=Xinclude.DoSub()
1494 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001495 v9.CheckScriptSuccess(lines)
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001496
1497 setline(1, ['Xthatfile'])
1498 exe "normal \<C-W>f"
1499 assert_equal('Xthisfile', expand('%'))
1500
1501 bwipe!
1502 bwipe!
1503 set includeexpr=
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001504enddef
1505
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001506def Test_import_in_indentexpr()
1507 var lines =<< trim END
1508 vim9script
1509 export def GetIndent(): number
1510 return 5
1511 enddef
1512 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001513 writefile(lines, 'Xindenter', 'D')
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001514
1515 lines =<< trim END
1516 vim9script
1517 import './Xindenter' as indent
1518 set indentexpr=indent.GetIndent()
1519 set debug=throw
1520 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001521 v9.CheckScriptSuccess(lines)
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001522
1523 new
1524 setline(1, 'hello')
1525 normal ==
1526 assert_equal(' hello', getline(1))
1527
1528 bwipe!
1529 set indentexpr= debug=
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001530enddef
1531
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001532func Test_import_in_printexpr()
1533 CheckFeature postscript
1534 call Run_Test_import_in_printexpr()
1535endfunc
1536
1537def Run_Test_import_in_printexpr()
1538 var lines =<< trim END
1539 vim9script
1540 export def PrintFile(): bool
1541 g:printed = 'yes'
1542 delete('v:fname_in')
1543 return false
1544 enddef
1545 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001546 writefile(lines, 'Xprint.vim', 'D')
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001547
1548 lines =<< trim END
1549 vim9script
1550 import './Xprint.vim'
1551 set printexpr=Xprint.PrintFile()
1552 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001553 v9.CheckScriptSuccess(lines)
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001554
1555 help
1556 hardcopy dummy args
1557 assert_equal('yes', g:printed)
1558
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001559 set printexpr=
1560enddef
1561
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001562" Test for using an imported function as 'findfunc'
1563func Test_import_in_findfunc()
1564 call Run_Test_import_in_findfunc()
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001565endfunc
1566
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001567def Run_Test_import_in_findfunc()
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001568 var lines =<< trim END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001569 vim9script
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001570
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001571 export def FindFunc(pat: string, cmdexpand: bool): list<string>
1572 var fnames = ['Xfile1.c', 'Xfile2.c', 'Xfile3.c']
1573 return fnames->filter((_, v) => v =~? pat)
1574 enddef
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001575 END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001576 writefile(lines, 'Xfindfunc', 'D')
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001577
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001578 # Test using the "set" command
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001579 lines =<< trim END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001580 vim9script
1581 import './Xfindfunc' as find1
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001582
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001583 set findfunc=find1.FindFunc
1584 END
1585 v9.CheckScriptSuccess(lines)
1586
1587 enew!
1588 find Xfile2
1589 assert_equal('Xfile2.c', @%)
1590 bwipe!
1591
1592 botright vert new
1593 find Xfile1
1594 assert_equal('Xfile1.c', @%)
1595 bw!
1596
1597 # Test using the option variable
1598 lines =<< trim END
1599 vim9script
1600 import './Xfindfunc' as find2
1601
1602 &findfunc = find2.FindFunc
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001603 END
1604 v9.CheckScriptSuccess(lines)
1605
1606 enew!
1607 find Xfile2
1608 assert_equal('Xfile2.c', @%)
1609 bwipe!
1610
1611 botright vert new
1612 find Xfile1
1613 assert_equal('Xfile1.c', @%)
1614
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001615 set findfunc=
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001616 bwipe!
1617enddef
1618
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001619def Test_import_in_charconvert()
1620 var lines =<< trim END
1621 vim9script
1622 export def MakeUpper(): bool
1623 var data = readfile(v:fname_in)
1624 map(data, 'toupper(v:val)')
1625 writefile(data, v:fname_out)
1626 return false # success
1627 enddef
1628 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001629 writefile(lines, 'Xconvert.vim', 'D')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001630
1631 lines =<< trim END
1632 vim9script
1633 import './Xconvert.vim' as conv
1634 set charconvert=conv.MakeUpper()
1635 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001636 v9.CheckScriptSuccess(lines)
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001637
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001638 writefile(['one', 'two'], 'Xiicfile', 'D')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001639 new Xiicfile
1640 write ++enc=ucase Xiicfile1
1641 assert_equal(['ONE', 'TWO'], readfile('Xiicfile1'))
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001642
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001643 delete('Xiicfile1')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001644 bwipe!
1645 set charconvert&
1646enddef
1647
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001648func Test_import_in_spellsuggest_expr()
1649 CheckFeature spell
1650 call Run_Test_import_in_spellsuggest_expr()
1651endfunc
1652
1653def Run_Test_import_in_spellsuggest_expr()
1654 var lines =<< trim END
1655 vim9script
1656 export def MySuggest(): list<any>
1657 return [['Fox', 8], ['Fop', 9]]
1658 enddef
1659 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001660 writefile(lines, 'Xsuggest.vim', 'D')
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001661
1662 lines =<< trim END
1663 vim9script
1664 import './Xsuggest.vim' as sugg
1665 set spell spellsuggest=expr:sugg.MySuggest()
1666 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001667 v9.CheckScriptSuccess(lines)
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001668
1669 set verbose=1 # report errors
1670 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
1671
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001672 set nospell spellsuggest& verbose=0
1673enddef
1674
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001675def Test_import_in_lambda_method()
1676 var lines =<< trim END
1677 vim9script
1678 export def Retarg(e: any): any
1679 return e
1680 enddef
1681 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001682 writefile(lines, 'XexportRetarg.vim', 'D')
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001683 lines =<< trim END
1684 vim9script
1685 import './XexportRetarg.vim'
1686 def Lambda(): string
1687 var F = (x) => x->XexportRetarg.Retarg()
1688 return F('arg')
1689 enddef
1690 assert_equal('arg', Lambda())
1691 END
1692 v9.CheckScriptSuccess(lines)
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001693enddef
1694
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001695def Test_export_shadows_global_function()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001696 mkdir('Xglobdir/autoload', 'pR')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001697 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001698 exe 'set rtp^=' .. getcwd() .. '/Xglobdir'
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001699
1700 var lines =<< trim END
1701 vim9script
1702 export def Shadow(): string
1703 return 'Shadow()'
1704 enddef
1705 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001706 writefile(lines, 'Xglobdir/autoload/shadow.vim')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001707
1708 lines =<< trim END
1709 vim9script
1710
1711 def g:Shadow(): string
1712 return 'global'
1713 enddef
1714
1715 import autoload 'shadow.vim'
1716 assert_equal('Shadow()', shadow.Shadow())
1717 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001718 v9.CheckScriptSuccess(lines)
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001719
1720 delfunc g:Shadow
1721 bwipe!
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001722 &rtp = save_rtp
1723enddef
1724
Bram Moolenaard8448622022-01-07 21:39:52 +00001725def Test_export_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001726 v9.CheckScriptFailure(['export var some = 123'], 'E1042:')
1727 v9.CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1728 v9.CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01001729 v9.CheckScriptFailure(['vim9script', 'export function /a1b2c3'], 'E1044:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001730
Bram Moolenaar5ab30012022-10-07 17:26:22 +01001731 assert_fails('export echo 1', 'E1043:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001732enddef
1733
1734func Test_import_fails_without_script()
1735 CheckRunVimInTerminal
1736
1737 " call indirectly to avoid compilation error for missing functions
1738 call Run_Test_import_fails_on_command_line()
1739endfunc
1740
1741def Run_Test_import_fails_on_command_line()
1742 var export =<< trim END
1743 vim9script
1744 export def Foo(): number
1745 return 0
1746 enddef
1747 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001748 writefile(export, 'XexportCmd.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001749
Bram Moolenaar62aec932022-01-29 21:45:34 +00001750 var buf = g:RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaard8448622022-01-07 21:39:52 +00001751 rows: 6, wait_for_ruler: 0})
Bram Moolenaar62aec932022-01-29 21:45:34 +00001752 g:WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaard8448622022-01-07 21:39:52 +00001753
Bram Moolenaar62aec932022-01-29 21:45:34 +00001754 g:StopVimInTerminal(buf)
Bram Moolenaard8448622022-01-07 21:39:52 +00001755enddef
1756
1757def Test_vim9_reload_noclear()
1758 var lines =<< trim END
1759 vim9script
1760 export var exported = 'thexport'
1761
1762 export def TheFunc(x = 0)
1763 enddef
1764 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001765 writefile(lines, 'XExportReload', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001766 lines =<< trim END
1767 vim9script noclear
1768 g:loadCount += 1
Bram Moolenaara749a422022-02-12 19:52:25 +00001769 var reloaded = 'init'
Bram Moolenaard8448622022-01-07 21:39:52 +00001770 import './XExportReload' as exp
1771
1772 def Again(): string
1773 return 'again'
1774 enddef
1775
1776 exp.TheFunc()
1777
Bram Moolenaara749a422022-02-12 19:52:25 +00001778 if exists('loaded') | finish | endif
1779 var loaded = true
Bram Moolenaard8448622022-01-07 21:39:52 +00001780
Bram Moolenaara749a422022-02-12 19:52:25 +00001781 var notReloaded = 'yes'
1782 reloaded = 'first'
Bram Moolenaard8448622022-01-07 21:39:52 +00001783 def g:Values(): list<string>
Bram Moolenaara749a422022-02-12 19:52:25 +00001784 return [reloaded, notReloaded, Again(), Once(), exp.exported]
Bram Moolenaard8448622022-01-07 21:39:52 +00001785 enddef
1786
1787 def Once(): string
1788 return 'once'
1789 enddef
1790 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001791 writefile(lines, 'XReloaded', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001792 g:loadCount = 0
1793 source XReloaded
1794 assert_equal(1, g:loadCount)
1795 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1796 source XReloaded
1797 assert_equal(2, g:loadCount)
1798 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1799 source XReloaded
1800 assert_equal(3, g:loadCount)
1801 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1802
Bram Moolenaard8448622022-01-07 21:39:52 +00001803 delfunc g:Values
1804 unlet g:loadCount
1805
1806 lines =<< trim END
1807 vim9script
1808 def Inner()
1809 enddef
1810 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001811 lines->writefile('XreloadScript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001812 source XreloadScript.vim
1813
1814 lines =<< trim END
1815 vim9script
1816 def Outer()
1817 def Inner()
1818 enddef
1819 enddef
1820 defcompile
1821 END
1822 lines->writefile('XreloadScript.vim')
1823 source XreloadScript.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00001824enddef
1825
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001826def Test_vim_reload_noclear_arg_count()
1827 var lines =<< trim END
1828 vim9script noclear
1829
1830 if !exists('g:didload')
1831 def Test(a: string, b: string)
1832 echo a b
1833 enddef
1834 def Call()
1835 Test('a', 'b')
1836 enddef
1837 else
1838 # redefine with one argument less
1839 def Test(a: string)
1840 echo a
1841 enddef
1842 endif
1843 Call()
1844 g:didload = 1
1845 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001846 lines->writefile('XreloadScript_1.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001847 source XreloadScript_1.vim
1848 assert_fails('source XreloadScript_1.vim', 'E1106: One argument too many')
1849 unlet g:didload
1850
1851 lines =<< trim END
1852 vim9script noclear
1853
1854 if !exists('g:didload')
1855 def Test(a: string, b: string, c: string)
1856 echo a b
1857 enddef
1858 def Call()
1859 Test('a', 'b', 'c')
1860 enddef
1861 else
1862 # redefine with one argument less
1863 def Test(a: string)
1864 echo a
1865 enddef
1866 endif
1867 Call()
1868 g:didload = 1
1869 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001870 lines->writefile('XreloadScript_2.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001871 source XreloadScript_2.vim
1872 assert_fails('source XreloadScript_2.vim', 'E1106: 2 arguments too many')
1873 unlet g:didload
1874
1875 lines =<< trim END
1876 vim9script noclear
1877
1878 if !exists('g:didload')
1879 def Test(a: string)
1880 echo a
1881 enddef
1882 def Call()
1883 Test('a')
1884 enddef
1885 else
1886 # redefine with one argument extra
1887 def Test(a: string, b: string)
1888 echo a b
1889 enddef
1890 endif
1891 Call()
1892 g:didload = 1
1893 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001894 lines->writefile('XreloadScript_3.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001895 source XreloadScript_3.vim
1896 assert_fails('source XreloadScript_3.vim', 'E1190: One argument too few')
1897 unlet g:didload
1898
1899 lines =<< trim END
1900 vim9script noclear
1901
1902 if !exists('g:didload')
1903 def Test(a: string)
1904 echo a
1905 enddef
1906 def Call()
1907 Test('a')
1908 enddef
1909 else
1910 # redefine with two arguments extra
1911 def Test(a: string, b: string, c: string)
1912 echo a b
1913 enddef
1914 endif
1915 Call()
1916 g:didload = 1
1917 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001918 lines->writefile('XreloadScript_4.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001919 source XreloadScript_4.vim
1920 assert_fails('source XreloadScript_4.vim', 'E1190: 2 arguments too few')
1921 unlet g:didload
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001922enddef
1923
1924def Test_vim9_reload_noclear_error()
1925 var lines =<< trim END
1926 vim9script noclear
1927
1928 if !exists('g:didload')
1929 def Test(a: string)
1930 echo a
1931 enddef
1932 def Call()
1933 Test('a')
1934 enddef
1935 else
1936 # redefine with a compile error
1937 def Test(a: string)
1938 echo ax
1939 enddef
1940 endif
1941 Call()
1942 g:didload = 1
1943 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001944 lines->writefile('XreloadScriptErr.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001945 source XreloadScriptErr.vim
1946 assert_fails('source XreloadScriptErr.vim', 'E1001: Variable not found: ax')
1947
1948 unlet g:didload
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001949enddef
1950
Bram Moolenaard8448622022-01-07 21:39:52 +00001951def Test_vim9_reload_import()
1952 var lines =<< trim END
1953 vim9script
1954 const var = ''
1955 var valone = 1234
1956 def MyFunc(arg: string)
1957 valone = 5678
1958 enddef
1959 END
1960 var morelines =<< trim END
1961 var valtwo = 222
1962 export def GetValtwo(): number
1963 return valtwo
1964 enddef
1965 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001966 writefile(lines + morelines, 'Xreload.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001967 source Xreload.vim
1968 source Xreload.vim
1969 source Xreload.vim
1970
1971 # cannot declare a var twice
1972 lines =<< trim END
1973 vim9script
1974 var valone = 1234
1975 var valone = 5678
1976 END
1977 writefile(lines, 'Xreload.vim')
1978 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1979
Bram Moolenaard8448622022-01-07 21:39:52 +00001980 delete('Ximport.vim')
1981enddef
1982
1983" if a script is reloaded with a script-local variable that changed its type, a
1984" compiled function using that variable must fail.
1985def Test_script_reload_change_type()
1986 var lines =<< trim END
1987 vim9script noclear
1988 var str = 'string'
1989 def g:GetStr(): string
1990 return str .. 'xxx'
1991 enddef
1992 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001993 writefile(lines, 'Xreload.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001994 source Xreload.vim
1995 echo g:GetStr()
1996
1997 lines =<< trim END
1998 vim9script noclear
1999 var str = 1234
2000 END
2001 writefile(lines, 'Xreload.vim')
2002 source Xreload.vim
2003 assert_fails('echo g:GetStr()', 'E1150:')
2004
2005 delfunc g:GetStr
Bram Moolenaard8448622022-01-07 21:39:52 +00002006enddef
2007
2008" Define CallFunc so that the test can be compiled
2009command CallFunc echo 'nop'
2010
2011def Test_script_reload_from_function()
2012 var lines =<< trim END
2013 vim9script
2014
Bram Moolenaar10611952022-04-03 21:11:34 +01002015 if exists('g:loadedThis')
Bram Moolenaard8448622022-01-07 21:39:52 +00002016 finish
2017 endif
Bram Moolenaar10611952022-04-03 21:11:34 +01002018 g:loadedThis = 1
Bram Moolenaard8448622022-01-07 21:39:52 +00002019 delcommand CallFunc
2020 command CallFunc Func()
2021 def Func()
2022 so XreloadFunc.vim
2023 g:didTheFunc = 1
2024 enddef
2025 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002026 writefile(lines, 'XreloadFunc.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002027 source XreloadFunc.vim
2028 CallFunc
2029 assert_equal(1, g:didTheFunc)
2030
Bram Moolenaard8448622022-01-07 21:39:52 +00002031 delcommand CallFunc
Bram Moolenaar10611952022-04-03 21:11:34 +01002032 unlet g:loadedThis
Bram Moolenaard8448622022-01-07 21:39:52 +00002033 unlet g:didTheFunc
2034enddef
2035
2036def s:RetSome(): string
2037 return 'some'
2038enddef
2039
2040" Not exported function that is referenced needs to be accessed by the
2041" script-local name.
2042def Test_vim9_funcref()
2043 var sortlines =<< trim END
2044 vim9script
2045 def Compare(i1: number, i2: number): number
2046 return i2 - i1
2047 enddef
2048
2049 export def FastSort(): list<number>
2050 return range(5)->sort(Compare)
2051 enddef
2052
2053 export def GetString(arg: string): string
2054 return arg
2055 enddef
2056 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002057 writefile(sortlines, 'Xsort.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002058
2059 var lines =<< trim END
2060 vim9script
2061 import './Xsort.vim'
2062 def Test()
2063 g:result = Xsort.FastSort()
2064 enddef
2065 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002066 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002067 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002068 source Xscript.vim
2069 assert_equal([4, 3, 2, 1, 0], g:result)
2070 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00002071
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002072 lines =<< trim END
2073 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00002074 # using a function imported with "as"
2075 import './Xsort.vim' as anAlias
2076 assert_equal('yes', anAlias.GetString('yes'))
2077
2078 # using the function from a compiled function
2079 def TestMore(): string
2080 var s = s:anAlias.GetString('foo')
2081 return s .. anAlias.GetString('bar')
2082 enddef
2083 assert_equal('foobar', TestMore())
2084
2085 # error when using a function that isn't exported
2086 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
2087 END
2088 writefile(lines, 'Xscript.vim')
2089
Bram Moolenaard8448622022-01-07 21:39:52 +00002090 var Funcref = function('s:RetSome')
2091 assert_equal('some', Funcref())
2092enddef
2093
2094" Check that when searching for "FilterFunc" it finds the import in the
2095" script where FastFilter() is called from, both as a string and as a direct
2096" function reference.
2097def Test_vim9_funcref_other_script()
2098 var filterLines =<< trim END
2099 vim9script
2100 export def FilterFunc(idx: number, val: number): bool
2101 return idx % 2 == 1
2102 enddef
2103 export def FastFilter(): list<number>
2104 return range(10)->filter('FilterFunc(v:key, v:val)')
2105 enddef
2106 export def FastFilterDirect(): list<number>
2107 return range(10)->filter(FilterFunc)
2108 enddef
2109 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002110 writefile(filterLines, 'Xfilter.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002111
2112 var lines =<< trim END
2113 vim9script
2114 import './Xfilter.vim' as filter
2115 def Test()
2116 var x: list<number> = filter.FastFilter()
2117 enddef
2118 Test()
2119 def TestDirect()
2120 var x: list<number> = filter.FastFilterDirect()
2121 enddef
2122 TestDirect()
2123 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002124 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +00002125enddef
2126
2127def Test_import_absolute()
2128 var import_lines = [
2129 'vim9script',
2130 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
2131 'def UseExported()',
2132 ' g:imported_abs = abs.exported',
2133 ' abs.exported = 8888',
2134 ' g:imported_after = abs.exported',
2135 'enddef',
2136 'UseExported()',
2137 'g:import_disassembled = execute("disass UseExported")',
2138 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002139 writefile(import_lines, 'Ximport_abs.vim', 'D')
2140 writefile(s:export_script_lines, 'Xexport_abs.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002141
2142 source Ximport_abs.vim
2143
2144 assert_equal(9876, g:imported_abs)
2145 assert_equal(8888, g:imported_after)
2146 assert_match('<SNR>\d\+_UseExported\_s*' ..
2147 'g:imported_abs = abs.exported\_s*' ..
2148 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2149 '1 STOREG g:imported_abs\_s*' ..
2150 'abs.exported = 8888\_s*' ..
2151 '2 PUSHNR 8888\_s*' ..
2152 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2153 'g:imported_after = abs.exported\_s*' ..
2154 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2155 '5 STOREG g:imported_after',
2156 g:import_disassembled)
2157
2158 Undo_export_script_lines()
2159 unlet g:imported_abs
2160 unlet g:import_disassembled
Bram Moolenaard8448622022-01-07 21:39:52 +00002161enddef
2162
2163def Test_import_rtp()
2164 var import_lines = [
2165 'vim9script',
2166 'import "Xexport_rtp.vim" as rtp',
2167 'g:imported_rtp = rtp.exported',
2168 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002169 writefile(import_lines, 'Ximport_rtp.vim', 'D')
2170 mkdir('import', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +00002171 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
2172
2173 var save_rtp = &rtp
2174 &rtp = getcwd()
2175 source Ximport_rtp.vim
2176 &rtp = save_rtp
2177
2178 assert_equal(9876, g:imported_rtp)
2179
2180 Undo_export_script_lines()
2181 unlet g:imported_rtp
Bram Moolenaard8448622022-01-07 21:39:52 +00002182enddef
2183
2184def Test_import_compile_error()
2185 var export_lines = [
2186 'vim9script',
2187 'export def ExpFunc(): string',
2188 ' return notDefined',
2189 'enddef',
2190 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002191 writefile(export_lines, 'Xexported.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002192
2193 var import_lines = [
2194 'vim9script',
2195 'import "./Xexported.vim" as expo',
2196 'def ImpFunc()',
2197 ' echo expo.ExpFunc()',
2198 'enddef',
2199 'defcompile',
2200 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002201 writefile(import_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002202
2203 try
2204 source Ximport.vim
2205 catch /E1001/
2206 # Error should be before the Xexported.vim file.
2207 assert_match('E1001: Variable not found: notDefined', v:exception)
2208 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
2209 endtry
Bram Moolenaard8448622022-01-07 21:39:52 +00002210enddef
2211
2212def Test_func_overrules_import_fails()
2213 var export_lines =<< trim END
2214 vim9script
2215 export def Func()
2216 echo 'imported'
2217 enddef
2218 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002219 writefile(export_lines, 'XexportedFunc.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002220
2221 var lines =<< trim END
2222 vim9script
2223 import './XexportedFunc.vim' as Func
2224 def Func()
2225 echo 'local to function'
2226 enddef
2227 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002228 v9.CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00002229
2230 lines =<< trim END
2231 vim9script
2232 import './XexportedFunc.vim' as Func
2233 def Outer()
2234 def Func()
2235 echo 'local to function'
2236 enddef
2237 enddef
2238 defcompile
2239 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002240 v9.CheckScriptFailure(lines, 'E1236:')
Bram Moolenaard8448622022-01-07 21:39:52 +00002241enddef
2242
2243def Test_source_vim9_from_legacy()
2244 var vim9_lines =<< trim END
2245 vim9script
2246 var local = 'local'
2247 g:global = 'global'
2248 export var exported = 'exported'
2249 export def GetText(): string
2250 return 'text'
2251 enddef
2252 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002253 writefile(vim9_lines, 'Xvim9_script.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002254
2255 var legacy_lines =<< trim END
2256 source Xvim9_script.vim
2257
2258 call assert_false(exists('local'))
2259 call assert_false(exists('exported'))
2260 call assert_false(exists('s:exported'))
2261 call assert_equal('global', global)
2262 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00002263 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002264 writefile(legacy_lines, 'Xlegacy_script.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002265
2266 source Xlegacy_script.vim
2267 assert_equal('global', g:global)
2268 unlet g:global
Bram Moolenaarb775e722022-11-22 18:12:44 +00002269
2270 legacy_lines =<< trim END
2271 import './Xvim9_script.vim'
2272 let g:global = s:Xvim9_script.GetText()
2273 END
2274 writefile(legacy_lines, 'Xlegacyimport.vim', 'D')
2275 source Xlegacyimport.vim
2276 assert_equal('text', g:global)
2277 unlet g:global
Bram Moolenaard8448622022-01-07 21:39:52 +00002278enddef
2279
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002280def Test_import_vim9_from_legacy()
2281 var vim9_lines =<< trim END
2282 vim9script
2283 var local = 'local'
2284 g:global = 'global'
2285 export var exported = 'exported'
2286 export def GetText(): string
2287 return 'text'
2288 enddef
Yegappan Lakshmananf1750ca2024-04-02 20:41:04 +02002289 export var exported_nr: number = 22
2290 def AddNum(n: number)
2291 exported_nr += n
2292 enddef
2293 export var exportedDict: dict<func> = {Fn: AddNum}
2294 export const CONST = 10
2295 export final finalVar = 'abc'
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002296 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002297 writefile(vim9_lines, 'Xvim9_export.vim', 'D')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002298
2299 var legacy_lines =<< trim END
2300 import './Xvim9_export.vim' as vim9
2301
2302 call assert_false(exists('vim9'))
2303 call assert_false(exists('local'))
2304 call assert_false(exists('s:vim9.local'))
2305 call assert_equal('global', global)
2306 call assert_equal('global', g:global)
2307 call assert_false(exists('exported'))
2308 call assert_false(exists('s:exported'))
2309 call assert_false(exists('*GetText'))
2310
2311 " imported symbol is script-local
2312 call assert_equal('exported', s:vim9.exported)
2313 call assert_equal('text', s:vim9.GetText())
Yegappan Lakshmananf1750ca2024-04-02 20:41:04 +02002314 call s:vim9.exportedDict.Fn(5)
2315 call assert_equal(27, s:vim9.exported_nr)
2316 call call(s:vim9.exportedDict.Fn, [3])
2317 call assert_equal(30, s:vim9.exported_nr)
2318 call assert_fails('let s:vim9.CONST = 20', 'E46: Cannot change read-only variable "CONST"')
2319 call assert_fails('let s:vim9.finalVar = ""', 'E46: Cannot change read-only variable "finalVar"')
2320 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 +00002321 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002322 writefile(legacy_lines, 'Xlegacy_script.vim', 'D')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002323
2324 source Xlegacy_script.vim
2325 assert_equal('global', g:global)
2326 unlet g:global
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002327enddef
2328
Bram Moolenaard8448622022-01-07 21:39:52 +00002329def Test_cmdline_win()
2330 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
2331 # the command line window.
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002332 mkdir('rtp/syntax', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +00002333 var export_lines =<< trim END
2334 vim9script
2335 export var That = 'yes'
2336 END
2337 writefile(export_lines, 'rtp/syntax/Xexport.vim')
2338 var import_lines =<< trim END
2339 vim9script
2340 import './Xexport.vim' as exp
2341 echo exp.That
2342 END
2343 writefile(import_lines, 'rtp/syntax/vim.vim')
2344 var save_rtp = &rtp
2345 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
2346 syntax on
2347 augroup CmdWin
2348 autocmd CmdwinEnter * g:got_there = 'yes'
2349 augroup END
2350 # this will open and also close the cmdline window
2351 feedkeys('q:', 'xt')
2352 assert_equal('yes', g:got_there)
2353
2354 augroup CmdWin
2355 au!
2356 augroup END
2357 &rtp = save_rtp
Bram Moolenaard8448622022-01-07 21:39:52 +00002358enddef
2359
2360def Test_import_gone_when_sourced_twice()
2361 var exportlines =<< trim END
2362 vim9script
2363 if exists('g:guard')
2364 finish
2365 endif
2366 g:guard = 1
2367 export var name = 'someName'
2368 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002369 writefile(exportlines, 'XexportScript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002370
2371 var lines =<< trim END
2372 vim9script
2373 import './XexportScript.vim' as expo
2374 def g:GetName(): string
2375 return expo.name
2376 enddef
2377 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002378 writefile(lines, 'XscriptImport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002379 so XscriptImport.vim
2380 assert_equal('someName', g:GetName())
2381
2382 so XexportScript.vim
2383 assert_fails('call g:GetName()', 'E1149:')
2384
2385 delfunc g:GetName
Bram Moolenaard8448622022-01-07 21:39:52 +00002386 unlet g:guard
2387enddef
2388
Bram Moolenaar160aa862022-01-10 21:29:57 +00002389" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002390def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002391 var lines =<< trim END
2392 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002393 export def Gettest(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002394 return 'test'
2395 enddef
2396 g:some#name = 'name'
2397 g:some#dict = {key: 'value'}
2398
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002399 export def Varargs(a1: string, ...l: list<string>): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002400 return a1 .. l[0] .. l[1]
2401 enddef
2402 END
2403
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002404 mkdir('Xfulldir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002405 writefile(lines, 'Xfulldir/autoload/some.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002406 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002407 exe 'set rtp^=' .. getcwd() .. '/Xfulldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002408
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002409 assert_equal('test', g:some#Gettest())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002410 assert_equal('name', g:some#name)
2411 assert_equal('value', g:some#dict.key)
2412 g:some#other = 'other'
2413 assert_equal('other', g:some#other)
2414
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002415 assert_equal('abc', some#Varargs('a', 'b', 'c'))
Bram Moolenaar160aa862022-01-10 21:29:57 +00002416
2417 # upper case script name works
2418 lines =<< trim END
2419 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002420 export def GetOther(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002421 return 'other'
2422 enddef
2423 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002424 writefile(lines, 'Xfulldir/autoload/Other.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002425 assert_equal('other', g:Other#GetOther())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002426
Bram Moolenaar160aa862022-01-10 21:29:57 +00002427 &rtp = save_rtp
2428enddef
2429
2430def Test_vim9script_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002431 mkdir('Xaldir/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002432 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002433 exe 'set rtp^=' .. getcwd() .. '/Xaldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002434
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002435 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00002436 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002437 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002438 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00002439
2440 export def Gettest(): string
2441 return 'test'
2442 enddef
2443
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002444 export var name = 'name'
2445
2446 export func GetFunc()
2447 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00002448 endfunc
2449
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002450 export def GetDef(): string
2451 return Gettest() .. 'more' .. name
2452 enddef
2453
Bram Moolenaar160aa862022-01-10 21:29:57 +00002454 export final fname = 'final'
2455 export const cname = 'const'
2456 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002457 writefile(lines, 'Xaldir/autoload/prefixed.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002458
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002459 g:prefixed_loaded = 0
2460 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00002461 lines =<< trim END
2462 vim9script
2463 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002464 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002465 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002466 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002467
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002468 assert_equal('testmorename', prefixed.GetFunc())
2469 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002470 assert_equal('name', prefixed.name)
2471 assert_equal('final', prefixed.fname)
2472 assert_equal('const', prefixed.cname)
2473 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002474 v9.CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002475 # can source it again, autoload script not loaded again
2476 g:expected_loaded = 1
Bram Moolenaar62aec932022-01-29 21:45:34 +00002477 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002478
2479 # can also get the items by autoload name
2480 lines =<< trim END
2481 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002482 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002483 call assert_equal('name', prefixed#name)
2484 call assert_equal('final', prefixed#fname)
2485 call assert_equal('const', prefixed#cname)
2486 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002487 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002488
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002489 unlet g:prefixed_loaded
2490 unlet g:expected_loaded
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002491 &rtp = save_rtp
2492enddef
2493
Bram Moolenaard02dce22022-01-18 17:43:04 +00002494def Test_import_autoload_not_exported()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002495 mkdir('Xnimdir/autoload', 'pR')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002496 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002497 exe 'set rtp^=' .. getcwd() .. '/Xnimdir'
Bram Moolenaard02dce22022-01-18 17:43:04 +00002498
2499 # error when using an item that is not exported from an autoload script
2500 var exportLines =<< trim END
2501 vim9script
2502 var notExported = 123
2503 def NotExport()
2504 echo 'nop'
2505 enddef
2506 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002507 writefile(exportLines, 'Xnimdir/autoload/notExport1.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002508
2509 var lines =<< trim END
2510 vim9script
2511 import autoload 'notExport1.vim'
2512 echo notExport1.notFound
2513 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002514 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002515
2516 lines =<< trim END
2517 vim9script
2518 import autoload 'notExport1.vim'
2519 echo notExport1.notExported
2520 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002521 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002522
2523 lines =<< trim END
2524 vim9script
2525 import autoload 'notExport1.vim'
2526 echo notExport1.NotFunc()
2527 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002528 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002529
2530 lines =<< trim END
2531 vim9script
2532 import autoload 'notExport1.vim'
2533 echo notExport1.NotExport()
2534 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002535 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002536
2537 lines =<< trim END
2538 vim9script
2539 import autoload 'notExport1.vim'
2540 echo 'text'->notExport1.NotFunc()
2541 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002542 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002543
2544 lines =<< trim END
2545 vim9script
2546 import autoload 'notExport1.vim'
2547 echo 'text'->notExport1.NotExport()
2548 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002549 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002550
2551 # using a :def function we use a different autoload script every time so that
2552 # the function is compiled without the script loaded
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002553 writefile(exportLines, 'Xnimdir/autoload/notExport2.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002554 lines =<< trim END
2555 vim9script
2556 import autoload 'notExport2.vim'
2557 def Testit()
2558 echo notExport2.notFound
2559 enddef
2560 Testit()
2561 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002562 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002563
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002564 writefile(exportLines, 'Xnimdir/autoload/notExport3.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002565 lines =<< trim END
2566 vim9script
2567 import autoload 'notExport3.vim'
2568 def Testit()
2569 echo notExport3.notExported
2570 enddef
2571 Testit()
2572 END
2573 # don't get E1049 because it is too complicated to figure out
Bram Moolenaar62aec932022-01-29 21:45:34 +00002574 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002575
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002576 writefile(exportLines, 'Xnimdir/autoload/notExport4.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002577 lines =<< trim END
2578 vim9script
2579 import autoload 'notExport4.vim'
2580 def Testit()
2581 echo notExport4.NotFunc()
2582 enddef
2583 Testit()
2584 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002585 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002586
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002587 writefile(exportLines, 'Xnimdir/autoload/notExport5.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002588 lines =<< trim END
2589 vim9script
2590 import autoload 'notExport5.vim'
2591 def Testit()
2592 echo notExport5.NotExport()
2593 enddef
2594 Testit()
2595 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002596 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002597
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002598 writefile(exportLines, 'Xnimdir/autoload/notExport6.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002599 lines =<< trim END
2600 vim9script
2601 import autoload 'notExport6.vim'
2602 def Testit()
2603 echo 'text'->notExport6.NotFunc()
2604 enddef
2605 Testit()
2606 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002607 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002608
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002609 writefile(exportLines, 'Xnimdir/autoload/notExport7.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002610 lines =<< trim END
2611 vim9script
2612 import autoload 'notExport7.vim'
2613 def Testit()
2614 echo 'text'->notExport7.NotExport()
2615 enddef
2616 Testit()
2617 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002618 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002619
Bram Moolenaard02dce22022-01-18 17:43:04 +00002620 &rtp = save_rtp
2621enddef
2622
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002623def Test_vim9script_autoload_call()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002624 mkdir('Xcalldir/autoload', 'pR')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002625 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002626 exe 'set rtp^=' .. getcwd() .. '/Xcalldir'
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002627
2628 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002629 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002630
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002631 export def RetArg(arg: string): string
2632 return arg
2633 enddef
2634
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002635 export def Getother()
2636 g:result = 'other'
2637 enddef
2638 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002639 writefile(lines, 'Xcalldir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002640
2641 lines =<< trim END
2642 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00002643 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002644
2645 # compile this before 'another.vim' is loaded
2646 def CallAnother()
2647 assert_equal('foo', 'foo'->another.RetArg())
2648 enddef
2649 CallAnother()
2650
Bram Moolenaar5d982692022-01-12 15:15:27 +00002651 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002652 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00002653
2654 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaar8164f6e2022-02-06 13:08:41 +00002655
2656 verbose function another.Getother
2657 # should we disallow this?
2658 verbose function another#Getother
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002659 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002660 v9.CheckScriptSuccess(lines)
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002661
2662 unlet g:result
Bram Moolenaar160aa862022-01-10 21:29:57 +00002663 &rtp = save_rtp
2664enddef
2665
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002666def Test_vim9script_noclear_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002667 mkdir('Xnocdir/autoload', 'pR')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002668 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002669 exe 'set rtp^=' .. getcwd() .. '/Xnocdir'
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002670
2671 var lines =<< trim END
2672 vim9script
2673 export def Func(): string
2674 return 'called'
2675 enddef
2676 g:double_loaded = 'yes'
2677 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002678 writefile(lines, 'Xnocdir/autoload/double.vim')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002679
2680 lines =<< trim END
2681 vim9script noclear
2682 if exists('g:script_loaded')
2683 finish
2684 endif
2685 g:script_loaded = true
2686
2687 import autoload 'double.vim'
2688 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
2689 END
2690 g:double_loaded = 'no'
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002691 writefile(lines, 'Xloaddouble', 'D')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002692 source Xloaddouble
2693 assert_equal('no', g:double_loaded)
2694 assert_equal(true, g:script_loaded)
2695 source Xloaddouble
2696 feedkeys("\<F3>", 'xt')
2697 assert_equal('called', g:result)
2698 assert_equal('yes', g:double_loaded)
2699
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002700 unlet g:double_loaded
2701 unlet g:script_loaded
2702 unlet g:result
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002703 &rtp = save_rtp
2704enddef
2705
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002706def Test_vim9script_autoload_duplicate()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002707 mkdir('Xdupdir/autoload', 'pR')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002708
2709 var lines =<< trim END
2710 vim9script
2711
2712 export def Func()
2713 enddef
2714
2715 def Func()
2716 enddef
2717 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002718 writefile(lines, 'Xdupdir/autoload/dupfunc.vim')
2719 assert_fails('source Xdupdir/autoload/dupfunc.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002720
2721 lines =<< trim END
2722 vim9script
2723
2724 def Func()
2725 enddef
2726
2727 export def Func()
2728 enddef
2729 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002730 writefile(lines, 'Xdupdir/autoload/dup2func.vim')
2731 assert_fails('source Xdupdir/autoload/dup2func.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002732
2733 lines =<< trim END
2734 vim9script
2735
2736 def Func()
2737 enddef
2738
2739 export var Func = 'asdf'
2740 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002741 writefile(lines, 'Xdupdir/autoload/dup3func.vim')
2742 assert_fails('source Xdupdir/autoload/dup3func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002743
2744 lines =<< trim END
2745 vim9script
2746
2747 export var Func = 'asdf'
2748
2749 def Func()
2750 enddef
2751 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002752 writefile(lines, 'Xdupdir/autoload/dup4func.vim')
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01002753 assert_fails('source Xdupdir/autoload/dup4func.vim', 'E1041:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002754
2755 lines =<< trim END
2756 vim9script
2757
2758 var Func = 'asdf'
2759
2760 export def Func()
2761 enddef
2762 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002763 writefile(lines, 'Xdupdir/autoload/dup5func.vim')
2764 assert_fails('source Xdupdir/autoload/dup5func.vim', 'E707:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002765
2766 lines =<< trim END
2767 vim9script
2768
2769 export def Func()
2770 enddef
2771
2772 var Func = 'asdf'
2773 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002774 writefile(lines, 'Xdupdir/autoload/dup6func.vim')
2775 assert_fails('source Xdupdir/autoload/dup6func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002776enddef
2777
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002778def Test_autoload_missing_function_name()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002779 mkdir('Xmisdir/autoload', 'pR')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002780
2781 var lines =<< trim END
2782 vim9script
2783
2784 def loadme#()
2785 enddef
2786 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002787 writefile(lines, 'Xmisdir/autoload/loadme.vim')
2788 assert_fails('source Xmisdir/autoload/loadme.vim', 'E129:')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002789enddef
2790
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002791def Test_autoload_name_wrong()
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002792 var lines =<< trim END
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002793 def Xscriptname#Func()
2794 enddef
2795 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002796 writefile(lines, 'Xscriptname.vim', 'D')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002797 v9.CheckScriptFailure(lines, 'E746:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002798
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002799 mkdir('Xwrodir/autoload', 'pR')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002800 lines =<< trim END
2801 vim9script
2802 def somescript#Func()
2803 enddef
2804 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002805 writefile(lines, 'Xwrodir/autoload/somescript.vim')
2806 assert_fails('source Xwrodir/autoload/somescript.vim', 'E1263:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002807
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002808 delete('Xwrodir', 'rf')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002809enddef
2810
Bram Moolenaard041f422022-01-12 19:54:00 +00002811def Test_import_autoload_postponed()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002812 mkdir('Xpostdir/autoload', 'pR')
Bram Moolenaard041f422022-01-12 19:54:00 +00002813 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002814 exe 'set rtp^=' .. getcwd() .. '/Xpostdir'
Bram Moolenaard041f422022-01-12 19:54:00 +00002815
2816 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002817 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00002818
2819 g:loaded_postponed = 'true'
2820 export var variable = 'bla'
2821 export def Function(): string
2822 return 'bla'
2823 enddef
2824 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002825 writefile(lines, 'Xpostdir/autoload/postponed.vim')
Bram Moolenaard041f422022-01-12 19:54:00 +00002826
2827 lines =<< trim END
2828 vim9script
2829
2830 import autoload 'postponed.vim'
2831 def Tryit()
2832 echo postponed.variable
2833 echo postponed.Function()
2834 enddef
2835 defcompile
2836 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002837 v9.CheckScriptSuccess(lines)
Bram Moolenaard041f422022-01-12 19:54:00 +00002838 assert_false(exists('g:loaded_postponed'))
Bram Moolenaar62aec932022-01-29 21:45:34 +00002839 v9.CheckScriptSuccess(lines + ['Tryit()'])
Bram Moolenaard041f422022-01-12 19:54:00 +00002840 assert_equal('true', g:loaded_postponed)
2841
2842 unlet g:loaded_postponed
Bram Moolenaard041f422022-01-12 19:54:00 +00002843 &rtp = save_rtp
2844enddef
2845
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002846def Test_import_autoload_override()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002847 mkdir('Xoverdir/autoload', 'pR')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002848 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002849 exe 'set rtp^=' .. getcwd() .. '/Xoverdir'
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002850 test_override('autoload', 1)
2851
2852 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002853 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002854
2855 g:loaded_override = 'true'
2856 export var variable = 'bla'
2857 export def Function(): string
2858 return 'bla'
2859 enddef
2860 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002861 writefile(lines, 'Xoverdir/autoload/override.vim')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002862
2863 lines =<< trim END
2864 vim9script
2865
2866 import autoload 'override.vim'
2867 assert_equal('true', g:loaded_override)
2868
2869 def Tryit()
2870 echo override.doesNotExist
2871 enddef
2872 defcompile
2873 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002874 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002875
2876 test_override('autoload', 0)
2877 unlet g:loaded_override
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002878 &rtp = save_rtp
2879enddef
2880
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002881def Test_autoload_mapping()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002882 mkdir('Xmapdir/autoload', 'pR')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002883 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002884 exe 'set rtp^=' .. getcwd() .. '/Xmapdir'
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002885
2886 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002887 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002888
2889 g:toggle_loaded = 'yes'
2890
2891 export def Toggle(): string
2892 return ":g:toggle_called = 'yes'\<CR>"
2893 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002894 export def Doit()
2895 g:doit_called = 'yes'
2896 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002897 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002898 writefile(lines, 'Xmapdir/autoload/toggle.vim')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002899
2900 lines =<< trim END
2901 vim9script
2902
2903 import autoload 'toggle.vim'
2904
Bram Moolenaar94722c52023-01-28 19:19:03 +00002905 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002906 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2907 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002908 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002909 v9.CheckScriptSuccess(lines)
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002910 assert_false(exists("g:toggle_loaded"))
2911 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002912 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002913
2914 feedkeys("tt", 'xt')
2915 assert_equal('yes', g:toggle_loaded)
2916 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002917 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002918
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002919 feedkeys("xx", 'xt')
2920 assert_equal('yes', g:doit_called)
2921
2922 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2923
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002924 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002925 nunmap xx
2926 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002927 unlet g:toggle_loaded
2928 unlet g:toggle_called
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002929 &rtp = save_rtp
2930enddef
2931
Bram Moolenaar160aa862022-01-10 21:29:57 +00002932def Test_vim9script_autoload_fails()
2933 var lines =<< trim END
2934 vim9script autoload
2935 var n = 0
2936 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002937 v9.CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002938
2939 lines =<< trim END
2940 vim9script noclear noclear
2941 var n = 0
2942 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002943 v9.CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01002944
2945 lines =<< trim END
2946 vim9script noclears
2947 var n = 0
2948 END
2949 v9.CheckScriptFailure(lines, 'E475: Invalid argument: noclears')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002950enddef
2951
2952def Test_import_autoload_fails()
2953 var lines =<< trim END
2954 vim9script
2955 import autoload autoload 'prefixed.vim'
2956 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002957 v9.CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002958
2959 lines =<< trim END
2960 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002961 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002962 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002963 v9.CheckScriptFailure(lines, 'E282:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002964
2965 lines =<< trim END
2966 vim9script
2967 import autoload '/dir/doesNotExist.vim'
2968 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002969 v9.CheckScriptFailure(lines, 'E282:', 2)
2970
2971 lines =<< trim END
2972 vim9script
2973 import autoload '../testdir'
2974 END
2975 v9.CheckScriptFailure(lines, 'E17:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002976
2977 lines =<< trim END
2978 vim9script
2979 import autoload 'doesNotExist.vim'
2980 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002981 v9.CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002982enddef
2983
2984" test disassembling an auto-loaded function starting with "debug"
2985def Test_vim9_autoload_disass()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002986 mkdir('Xdasdir/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002987 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002988 exe 'set rtp^=' .. getcwd() .. '/Xdasdir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002989
2990 var lines =<< trim END
2991 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002992 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002993 return 'debug'
2994 enddef
2995 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002996 writefile(lines, 'Xdasdir/autoload/debugit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002997
2998 lines =<< trim END
2999 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003000 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00003001 return 'profile'
3002 enddef
3003 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003004 writefile(lines, 'Xdasdir/autoload/profileit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003005
3006 lines =<< trim END
3007 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003008 assert_equal('debug', debugit#Test())
3009 disass debugit#Test
3010 assert_equal('profile', profileit#Test())
3011 disass profileit#Test
Bram Moolenaar160aa862022-01-10 21:29:57 +00003012 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003013 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00003014
Bram Moolenaar160aa862022-01-10 21:29:57 +00003015 &rtp = save_rtp
3016enddef
3017
3018" test using a vim9script that is auto-loaded from an autocmd
3019def Test_vim9_aucmd_autoload()
3020 var lines =<< trim END
3021 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003022 export def Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00003023 echomsg getreg('"')
3024 enddef
3025 END
3026
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003027 mkdir('Xauldir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003028 writefile(lines, 'Xauldir/autoload/foo.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003029 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003030 exe 'set rtp^=' .. getcwd() .. '/Xauldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00003031 augroup test
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003032 autocmd TextYankPost * call foo#Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00003033 augroup END
3034
3035 normal Y
3036
3037 augroup test
3038 autocmd!
3039 augroup END
Bram Moolenaar160aa862022-01-10 21:29:57 +00003040 &rtp = save_rtp
3041enddef
3042
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003043" test using a autoloaded file that is case sensitive
3044def Test_vim9_autoload_case_sensitive()
3045 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00003046 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003047 export def CaseSensitive(): string
3048 return 'done'
3049 enddef
3050 END
3051
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003052 mkdir('Xcasedir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003053 writefile(lines, 'Xcasedir/autoload/CaseSensitive.vim')
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003054 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003055 exe 'set rtp^=' .. getcwd() .. '/Xcasedir'
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003056
3057 lines =<< trim END
3058 vim9script
3059 import autoload 'CaseSensitive.vim'
3060 assert_equal('done', CaseSensitive.CaseSensitive())
3061 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003062 v9.CheckScriptSuccess(lines)
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003063
Bram Moolenaarbfac4092022-01-16 11:12:12 +00003064 if !has('fname_case')
3065 lines =<< trim END
3066 vim9script
3067 import autoload 'CaseSensitive.vim'
3068 import autoload 'casesensitive.vim'
3069 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003070 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaarbfac4092022-01-16 11:12:12 +00003071 endif
3072
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003073 &rtp = save_rtp
3074enddef
3075
Bram Moolenaar160aa862022-01-10 21:29:57 +00003076" This was causing a crash because suppress_errthrow wasn't reset.
3077def Test_vim9_autoload_error()
3078 var lines =<< trim END
3079 vim9script
3080 def crash#func()
3081 try
3082 for x in List()
3083 endfor
3084 catch
3085 endtry
3086 g:ok = true
3087 enddef
3088 fu List()
3089 invalid
3090 endfu
3091 try
3092 alsoinvalid
3093 catch /wontmatch/
3094 endtry
3095 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003096 call mkdir('Xruntime/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003097 call writefile(lines, 'Xruntime/autoload/crash.vim')
3098
3099 # run in a separate Vim to avoid the side effects of assert_fails()
3100 lines =<< trim END
3101 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
3102 call crash#func()
3103 call writefile(['ok'], 'Xdidit')
3104 qall!
3105 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003106 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003107 g:RunVim([], [], '-S Xscript')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003108 assert_equal(['ok'], readfile('Xdidit'))
3109
3110 delete('Xdidit')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003111
3112 lines =<< trim END
3113 vim9script
3114 var foo#bar = 'asdf'
3115 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003116 v9.CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar160aa862022-01-10 21:29:57 +00003117enddef
3118
Bram Moolenaar753885b2022-08-24 16:30:36 +01003119def Test_vim9_import_symlink()
3120 if !has('unix')
3121 CheckUnix
3122 else
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003123 mkdir('Xto/plugin', 'pR')
Bram Moolenaar753885b2022-08-24 16:30:36 +01003124 var lines =<< trim END
3125 vim9script
3126 import autoload 'bar.vim'
nwounkn36b66762024-06-02 16:10:07 +02003127 def FooFunc(): string
3128 return bar.Func()
3129 enddef
3130 g:resultFunc = FooFunc()
Bram Moolenaar753885b2022-08-24 16:30:36 +01003131 g:resultValue = bar.value
3132 END
3133 writefile(lines, 'Xto/plugin/foo.vim')
3134
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003135 mkdir('Xto/autoload', 'pR')
Bram Moolenaar753885b2022-08-24 16:30:36 +01003136 lines =<< trim END
3137 vim9script
3138 export def Func(): string
3139 return 'func'
3140 enddef
3141 export var value = 'val'
3142 END
3143 writefile(lines, 'Xto/autoload/bar.vim')
3144
3145 var save_rtp = &rtp
3146 &rtp = getcwd() .. '/Xfrom'
3147 system('ln -s ' .. getcwd() .. '/Xto Xfrom')
3148
3149 source Xfrom/plugin/foo.vim
3150 assert_equal('func', g:resultFunc)
3151 assert_equal('val', g:resultValue)
3152
3153 var infoTo = getscriptinfo()->filter((_, v) => v.name =~ 'Xto/autoload/bar')
3154 var infoFrom = getscriptinfo()->filter((_, v) => v.name =~ 'Xfrom/autoload/bar')
3155 assert_equal(1, len(infoTo))
3156 assert_equal(1, len(infoFrom))
3157 assert_equal(infoTo[0].sid, infoFrom[0].sourced)
Bram Moolenaar7ea9fcb2022-08-24 17:46:12 +01003158 var output: string
3159 redir => output
3160 scriptnames
3161 redir END
3162 assert_match(infoFrom[0].sid .. '->' .. infoFrom[0].sourced .. '.*Xfrom', output)
Bram Moolenaar753885b2022-08-24 16:30:36 +01003163
3164 unlet g:resultFunc
3165 unlet g:resultValue
3166 &rtp = save_rtp
Bram Moolenaar753885b2022-08-24 16:30:36 +01003167 delete('Xfrom', 'rf')
Ernie Rael9a901792024-04-16 22:11:56 +02003168
3169 # Access item from :def imported through symbolic linked directory. #14536
3170 mkdir('Xto/real_dir', 'pR')
3171 lines =<< trim END
3172 vim9script
3173 export const val = 17
3174 export def F(): number
3175 return 23
3176 enddef
3177 END
3178 writefile(lines, 'Xto/real_dir/real_file.vim')
3179 system('ln -s real_dir Xto/syml_dir')
3180 defer delete('Xto/syml_dir')
3181 lines =<< trim END
3182 vim9script
3183 import autoload './Xto/syml_dir/real_file.vim'
3184
3185 def Fmain()
3186 assert_equal(17, real_file.val)
3187 enddef
3188 def F2()
3189 assert_equal(23, real_file.F())
3190 enddef
3191 Fmain()
3192 F2()
3193 END
3194 v9.CheckScriptSuccess(lines)
Bram Moolenaar753885b2022-08-24 16:30:36 +01003195 endif
3196enddef
3197
LemonBoy90c27b22023-08-27 19:28:15 +02003198def Test_export_in_conditional_block()
3199 var lines =<< trim END
3200 vim9script
3201 if exists('this_will_fail')
3202 export var MyVar = "hello"
3203 endif
3204 END
3205 v9.CheckScriptSuccess(lines)
3206enddef
3207
Yegappan Lakshmananfa630082024-03-10 19:22:38 +01003208" Import fails when an autoloaded script is imported again.
3209" Github issue #14171
3210def Test_import_autloaded_script()
3211 mkdir('Ximporttwice', 'pR')
3212 mkdir('Ximporttwice/plugin')
3213 mkdir('Ximporttwice/autoload')
3214 var save_rtp = &rtp
3215 exe 'set rtp^=' .. getcwd() .. '/Ximporttwice'
3216
3217 var lines =<< trim END
3218 vim9script
3219
3220 export def H(): number
3221 return 10
3222 enddef
3223 END
3224 writefile(lines, 'Ximporttwice/autoload/hello.vim')
3225
3226 lines =<< trim END
3227 vim9script
3228
3229 import "./hello.vim"
3230 export def W(): number
3231 return 20
3232 enddef
3233 END
3234 writefile(lines, 'Ximporttwice/autoload/world.vim')
3235
3236 lines =<< trim END
3237 vim9script
3238
3239 import autoload '../autoload/hello.vim'
3240 import autoload '../autoload/world.vim'
3241
3242 command Hello echo hello.H()
3243 command World echo world.W()
3244 END
3245 writefile(lines, 'Ximporttwice/plugin/main.vim')
3246
3247 lines =<< trim END
3248 vim9script
3249
3250 source ./Ximporttwice/plugin/main.vim
3251 assert_equal(['20'], execute('World')->split("\n"))
3252 END
3253 v9.CheckScriptSuccess(lines)
3254
3255 &rtp = save_rtp
3256enddef
Bram Moolenaard8448622022-01-07 21:39:52 +00003257
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02003258" Test for autoloading an imported dict func
3259def Test_autoload_import_dict_func()
3260 mkdir('Xdir/autoload', 'pR')
3261 var lines =<< trim END
3262 vim9script
3263 export var al_exported_nr: number = 33
3264 def Al_AddNum(n: number)
3265 al_exported_nr += n
3266 enddef
3267 export var al_exportedDict: dict<func> = {Fn: Al_AddNum}
3268 END
3269 writefile(lines, 'Xdir/autoload/Xdictfunc.vim')
3270
3271 var save_rtp = &rtp
3272 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3273 lines =<< trim END
3274 import './Xdir/autoload/Xdictfunc.vim'
3275 call Xdictfunc#al_exportedDict.Fn(5)
3276 call assert_equal(38, Xdictfunc#al_exported_nr)
3277 call call(Xdictfunc#al_exportedDict.Fn, [3])
3278 call assert_equal(41, Xdictfunc#al_exported_nr)
3279 END
3280 v9.CheckScriptSuccess(lines)
3281 &rtp = save_rtp
3282enddef
3283
Yegappan Lakshmanan9937d8b2024-05-08 20:24:33 +02003284" Test for changing the value of an imported Dict item
3285def Test_set_imported_dict_item()
3286 var lines =<< trim END
3287 vim9script
3288 export var dict1: dict<bool> = {bflag: false}
3289 export var dict2: dict<dict<bool>> = {x: {bflag: false}}
3290 END
3291 writefile(lines, 'XimportedDict.vim', 'D')
3292
3293 lines =<< trim END
3294 vim9script
3295 import './XimportedDict.vim'
3296 assert_equal(XimportedDict.dict1.bflag, false)
3297 XimportedDict.dict1.bflag = true
3298 assert_equal(XimportedDict.dict1.bflag, true)
3299 XimportedDict.dict2.x.bflag = true
3300 assert_equal(XimportedDict.dict2.x.bflag, true)
3301 assert_equal('bool', typename(XimportedDict.dict1.bflag))
3302 assert_equal('bool', typename(XimportedDict.dict2.x.bflag))
3303 assert_equal('bool', typename(XimportedDict.dict2['x'].bflag))
3304 assert_equal('bool', typename(XimportedDict.dict2.x['bflag']))
3305
3306 assert_equal(XimportedDict.dict1['bflag'], true)
3307 XimportedDict.dict1['bflag'] = false
3308 assert_equal(XimportedDict.dict1.bflag, false)
3309 XimportedDict.dict2['x']['bflag'] = false
3310 assert_equal(XimportedDict.dict2['x'].bflag, false)
3311 END
3312 v9.CheckScriptSuccess(lines)
3313
3314 lines =<< trim END
3315 vim9script
3316 import './XimportedDict.vim'
3317 XimportedDict.dict2.x.bflag = []
3318 END
3319 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected bool but got list<any>', 3)
3320enddef
3321
3322" Test for changing the value of an imported class member
3323def Test_set_imported_class_member()
3324 var lines =<< trim END
3325 vim9script
3326 export class Config
3327 public static var option = false
3328 endclass
3329 END
3330 writefile(lines, 'XimportedClass.vim', 'D')
3331
3332 lines =<< trim END
3333 vim9script
3334 import './XimportedClass.vim' as foo
3335 type FooConfig = foo.Config
3336 assert_equal(false, FooConfig.option)
3337 assert_equal(false, foo.Config.option)
3338 foo.Config.option = true
3339 assert_equal(true, foo.Config.option)
3340 assert_equal(true, FooConfig.option)
3341 END
3342 v9.CheckScriptSuccess(lines)
3343enddef
3344
Yegappan Lakshmanan8c35c262024-05-10 13:10:54 +02003345" Test for using an imported function from the vimrc file.  The function is
3346" defined in the 'start' directory of a package.
3347def Test_import_from_vimrc()
3348 mkdir('Ximport/pack/foobar/start/foo/autoload', 'pR')
3349 var lines =<< trim END
3350 vim9script
3351 export def Foo()
3352 writefile(['Foo called'], 'Xoutput.log')
3353 enddef
3354 END
3355 writefile(lines, 'Ximport/pack/foobar/start/foo/autoload/foo.vim')
3356 lines =<< trim END
3357 vim9script
3358 set packpath+=./Ximport
3359 try
3360 import autoload 'foo.vim'
3361 foo.Foo()
3362 catch
3363 writefile(['Failed to import foo.vim'], 'Xoutput.log')
3364 endtry
3365 qall!
3366 END
3367 writefile(lines, 'Xvimrc', 'D')
3368 g:RunVim([], [], '-u Xvimrc')
3369 assert_equal(['Foo called'], readfile('Xoutput.log'))
3370 delete('Xoutput.log')
3371enddef
3372
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02003373" Test for changing a locked imported variable
3374def Test_import_locked_var()
3375 var lines =<< trim END
3376 vim9script
3377 export var Foo: number = 10
3378 lockvar Foo
3379 END
3380 writefile(lines, 'Ximportlockedvar.vim', 'D')
3381 lines =<< trim END
3382 vim9script
3383 import './Ximportlockedvar.vim' as Bar
3384 Bar.Foo = 20
3385 END
3386 v9.CheckScriptFailure(lines, 'E741: Value is locked: Foo', 3)
3387enddef
3388
Yegappan Lakshmanand79ea472025-01-20 21:09:13 +01003389" Test for using an autoload imported class as the function return type
3390def Test_imported_class_as_def_func_rettype()
3391 var lines =<< trim END
3392 vim9script
3393
3394 export class Foo
3395 var name: string = "foo"
3396 endclass
3397 END
3398 writefile(lines, 'Ximportclassrettype1.vim', 'D')
3399
3400 lines =<< trim END
3401 vim9script
3402
3403 import autoload "./Ximportclassrettype1.vim" as A
3404
3405 export def CreateFoo(): A.Foo
3406 return A.Foo.new()
3407 enddef
3408 END
3409 writefile(lines, 'Ximportclassrettype2.vim', 'D')
3410
3411 lines =<< trim END
3412 vim9script
3413
3414 import './Ximportclassrettype2.vim' as B
3415
3416 var foo = B.CreateFoo()
3417 assert_equal('foo', foo.name)
3418 END
3419 v9.CheckScriptSuccess(lines)
3420enddef
3421
Hirohito Higashi645a4282025-02-09 16:41:23 +01003422" Test for don't crash when using a combination of import and class extends
3423def Test_vim9_import_and_class_extends()
3424 var lines =<< trim END
3425 vim9script
3426 import './cccc.vim'
3427 export class Property extends cccc.Run
3428 public var value: string
3429 def new(this.value)
3430 cccc.Run.value2 = this.value
3431 enddef
3432 endclass
3433 END
3434 writefile(lines, './aaaa.vim', 'D')
3435
3436 lines =<< trim END
3437 vim9script
3438 export class Run
3439 public var value2: string
3440 def new(this.value)
3441 enddef
3442 endclass
3443 END
3444 writefile(lines, './cccc.vim', 'D')
3445
3446 lines =<< trim END
3447 vim9script
3448 import './aaaa.vim'
3449 class View
3450 var content = aaaa.Property.new('')
3451 endclass
3452
3453 var myView = View.new('This should be ok')
3454 assert_equal('This should be ok', myView.content.value)
3455 END
Yegappan Lakshmanan54d7f182025-02-10 21:35:07 +01003456 v9.CheckScriptFailure(lines, 'E1376: Object variable "value2" accessible only using class "Run" object', 2)
Hirohito Higashi645a4282025-02-09 16:41:23 +01003457enddef
3458
Hirohito Higashibf7c88d2025-02-13 21:04:07 +01003459" Test for import and class extends
3460def Test_vim9_import_and_class_extends_2()
3461 mkdir('import', 'R')
3462 var save_rtp = &rtp
3463 &rtp = getcwd()
3464
3465 var lines =<< trim END
3466 vim9script
3467 export class Property
3468 public var value: string
3469 endclass
3470 END
3471 writefile(lines, './import/libproperty.vim')
3472
3473 lines =<< trim END
3474 vim9script
3475 import 'libproperty.vim'
3476 export class View
3477 var _content = libproperty.Property.new('')
3478 endclass
3479 END
3480 writefile(lines, './import/libview.vim')
3481
3482 lines =<< trim END
3483 vim9script
3484 import 'libview.vim'
3485 class MyView extends libview.View
3486 def new(value: string)
3487 this._content.value = value
3488 enddef
3489 endclass
3490 var myView = MyView.new('This should be ok')
3491 END
3492 v9.CheckScriptSuccess(lines)
3493 &rtp = save_rtp
3494enddef
3495
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003496" Test for using an imported class as a type
3497def Test_use_imported_class_as_type()
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003498 mkdir('Xdir', 'R')
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003499 mkdir('Xdir/autoload', 'D')
3500 mkdir('Xdir/import', 'D')
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003501 var lines =<< trim END
3502 vim9script
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003503 export class B
3504 var foo: string
3505 def new()
3506 this.foo = 'bar'
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003507 enddef
3508 endclass
3509 END
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003510 writefile(lines, 'Xdir/autoload/b.vim')
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003511
3512 lines =<< trim END
3513 vim9script
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003514 import autoload '../autoload/b.vim'
3515 export class A
3516 final AO: b.B = b.B.new()
3517 endclass
3518 var a = A.new()
3519 assert_equal('bar', a.AO.foo)
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003520 END
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003521 writefile(lines, 'Xdir/import/a.vim')
3522 source Xdir/import/a.vim
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003523enddef
3524
Yegappan Lakshmanane9ae35f2025-02-27 19:12:00 +01003525" Test for using an autoloaded class from another autoloaded script
3526def Test_class_from_auloaded_script()
3527 mkdir('Xdir', 'R')
3528 var save_rtp = &rtp
3529 &rtp = getcwd()
3530 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3531
3532 mkdir('Xdir/autoload/SomeClass/bar', 'p')
3533
3534 var lines =<< trim END
3535 vim9script
3536
3537 export class Baz
3538 static var v1: string = "v1"
3539 var v2: string = "v2"
3540 def GetName(): string
3541 return "baz"
3542 enddef
3543 endclass
3544 END
3545 writefile(lines, 'Xdir/autoload/SomeClass/bar/baz.vim', 'D')
3546
3547 lines =<< trim END
3548 vim9script
3549
3550 import autoload './bar/baz.vim'
3551
3552 export def MyTestFoo(): string
3553 assert_fails('var x = baz.Baz.NonExisting()', 'E1325: Method "NonExisting" not found in class "Baz"')
3554 assert_fails('var x = baz.Baz.foobar', 'E1337: Class variable "foobar" not found in class "Baz"')
3555
3556 const instance = baz.Baz.new()
3557 return $'{instance.GetName()} {baz.Baz.v1} {instance.v2}'
3558 enddef
3559 END
3560 writefile(lines, 'Xdir/autoload/SomeClass/foo.vim', 'D')
3561
3562 lines =<< trim END
3563 vim9script
3564
3565 import autoload 'SomeClass/foo.vim'
3566 import autoload 'SomeClass/bar/baz.vim'
3567
3568 def NotInAutoload()
3569 # Use non-existing class method and variable
3570 assert_fails('var x = baz.Baz.NonExisting()', 'E1325: Method "NonExisting" not found in class "Baz"')
3571
3572 var caught_exception = false
3573 try
3574 var x = baz.Baz.foobar
3575 catch /E1337: Class variable "foobar" not found in class "Baz"/
3576 caught_exception = true
3577 endtry
3578 assert_true(caught_exception)
3579
3580 const instance = baz.Baz.new()
3581 assert_equal("baz v1 v2", $'{instance.GetName()} {baz.Baz.v1} {instance.v2}')
3582 enddef
3583
3584 def InAutoload()
3585 assert_equal("baz v1 v2", foo.MyTestFoo())
3586 enddef
3587
3588 NotInAutoload()
3589 InAutoload()
3590 END
3591 v9.CheckScriptSuccess(lines)
3592
3593 &rtp = save_rtp
3594enddef
3595
3596" Test for using an autoloaded enum from another script
3597def Test_enum_from_auloaded_script()
3598 mkdir('Xdir', 'R')
3599 var save_rtp = &rtp
3600 &rtp = getcwd()
3601 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3602
3603 mkdir('Xdir/autoload/', 'p')
3604
3605 var lines =<< trim END
3606 vim9script
3607 export enum Color
3608 Red,
3609 Green,
3610 Blue
3611 endenum
3612 END
3613 writefile(lines, 'Xdir/autoload/color.vim', 'D')
3614
3615 lines =<< trim END
3616 vim9script
3617
3618 import autoload 'color.vim'
3619
3620 def CheckColor()
3621 var c = color.Color.Green
3622 assert_equal('Green', c.name)
3623 enddef
3624 CheckColor()
3625 END
3626 v9.CheckScriptSuccess(lines)
3627
3628 &rtp = save_rtp
3629enddef
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003630
Yegappan Lakshmanan16f2d3a2025-02-24 19:23:43 +01003631" Test for using a non-exported constant as an instance variable initiazer in an
3632" imported class
3633def Test_import_member_initializer()
3634 var lines =<< trim END
3635 vim9script
3636 const DEFAULT = 'default'
3637 export class Foo
3638 public var x = DEFAULT
3639 endclass
3640 END
3641 writefile(lines, 'Ximportclass.vim', 'D')
3642
3643 # The initializer for Foo.x is evaluated in the context of Ximportclass.vim.
3644 lines =<< trim END
3645 vim9script
3646 import './Ximportclass.vim' as X
3647 class Bar extends X.Foo
3648 endclass
3649 var o = Bar.new()
3650 assert_equal('default', o.x)
3651 END
3652 v9.CheckScriptSuccess(lines)
3653
3654 # Another test
3655 lines =<< trim END
3656 vim9script
3657
3658 export interface IObjKey
3659 var unique_object_id: string
3660 endinterface
3661
3662 # helper sub-class.
3663 export class ObjKey implements IObjKey
3664 const unique_object_id = GenerateKey()
3665 endclass
3666
3667 export def GenerateKey(): string
3668 return "SomeKey"
3669 enddef
3670 END
3671 writefile(lines, 'XobjKey.vim', 'D')
3672
3673 lines =<< trim END
3674 vim9script
3675
3676 import "./XobjKey.vim" as obj_key
3677
3678 const GenKey = obj_key.GenerateKey
3679
3680 class LocalObjKey implements obj_key.IObjKey
3681 const unique_object_id = GenKey()
3682 endclass
3683
3684 type Key1 = obj_key.ObjKey
3685 type Key2 = LocalObjKey
3686
3687 class C1 extends Key1
3688 endclass
3689 class C2 extends Key2
3690 endclass
3691 assert_equal('SomeKey', C1.new().unique_object_id)
3692 assert_equal('SomeKey', C2.new().unique_object_id)
3693 END
3694 v9.CheckScriptSuccess(lines)
3695enddef
3696
Bram Moolenaard8448622022-01-07 21:39:52 +00003697" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker