blob: 4e0b5332e6baebf2dff51b38f73079ff1c6682c3 [file] [log] [blame]
Bram Moolenaard8448622022-01-07 21:39:52 +00001" Test import/export of the Vim9 script language.
Bram Moolenaar160aa862022-01-10 21:29:57 +00002" Also the autoload mechanism.
Bram Moolenaard8448622022-01-07 21:39:52 +00003
4source check.vim
5source term_util.vim
6source vim9.vim
7
8let s:export_script_lines =<< trim END
9 vim9script
10 var name: string = 'bob'
11 def Concat(arg: string): string
12 return name .. arg
13 enddef
14 g:result = Concat('bie')
15 g:localname = name
16
17 export const CONST = 1234
18 export var exported = 9876
19 export var exp_name = 'John'
20 export def Exported(): string
21 return 'Exported'
22 enddef
23 export def ExportedValue(): number
24 return exported
25 enddef
26 export def ExportedInc()
27 exported += 5
28 enddef
29 export final theList = [1]
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000030 export def AddSome(s: string): string
31 return s .. 'some'
32 enddef
33 export var AddRef = AddSome
Bram Moolenaard8448622022-01-07 21:39:52 +000034END
35
36def Undo_export_script_lines()
37 unlet g:result
38 unlet g:localname
39enddef
40
41def Test_vim9_import_export()
42 writefile(s:export_script_lines, 'Xexport.vim')
43 var import_script_lines =<< trim END
44 vim9script
45 var dir = './'
46 var ext = ".vim"
47 import dir .. 'Xexport' .. ext as expo
48
49 g:exported1 = expo.exported
50 expo.exported += 3
51 g:exported2 = expo.exported
52 g:exported3 = expo.ExportedValue()
53
54 expo.ExportedInc()
55 g:exported_i1 = expo.exported
56 g:exported_i2 = expo.ExportedValue()
57
58 expo.exported = 11
59 g:exported_s1 = expo.exported
60 g:exported_s2 = expo.ExportedValue()
61
62 g:imported_func = expo.Exported()
63
64 def GetExported(): string
65 var local_dict = {ref: expo.Exported}
66 return local_dict.ref()
67 enddef
68 g:funcref_result = GetExported()
69
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +000070 def GetName(): string
71 return expo.exp_name .. 'son'
72 enddef
73 g:long_name = GetName()
74
Bram Moolenaard8448622022-01-07 21:39:52 +000075 g:imported_name = expo.exp_name
76 expo.exp_name ..= ' Doe'
Bram Moolenaar47036b62022-01-16 21:18:53 +000077 expo.exp_name = expo.exp_name .. ' Maar'
Bram Moolenaard8448622022-01-07 21:39:52 +000078 g:imported_name_appended = expo.exp_name
79 g:exported_later = expo.exported
80
81 expo.theList->add(2)
82 assert_equal([1, 2], expo.theList)
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000083
84 assert_equal('andthensome', 'andthen'->expo.AddSome())
85 assert_equal('awesome', 'awe'->expo.AddRef())
Bram Moolenaard8448622022-01-07 21:39:52 +000086 END
87 writefile(import_script_lines, 'Ximport.vim')
88 source Ximport.vim
89
90 assert_equal('bobbie', g:result)
91 assert_equal('bob', g:localname)
92 assert_equal(9876, g:exported1)
93 assert_equal(9879, g:exported2)
94 assert_equal(9879, g:exported3)
95
96 assert_equal(9884, g:exported_i1)
97 assert_equal(9884, g:exported_i2)
98
99 assert_equal(11, g:exported_s1)
100 assert_equal(11, g:exported_s2)
101 assert_equal(11, g:exported_later)
102
103 assert_equal('Exported', g:imported_func)
104 assert_equal('Exported', g:funcref_result)
105 assert_equal('John', g:imported_name)
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +0000106 assert_equal('Johnson', g:long_name)
Bram Moolenaar47036b62022-01-16 21:18:53 +0000107 assert_equal('John Doe Maar', g:imported_name_appended)
Bram Moolenaard8448622022-01-07 21:39:52 +0000108 assert_false(exists('g:name'))
109
110 Undo_export_script_lines()
111 unlet g:exported1
112 unlet g:exported2
113 unlet g:exported3
114 unlet g:exported_i1
115 unlet g:exported_i2
116 unlet g:exported_later
117 unlet g:imported_func
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +0000118 unlet g:imported_name g:long_name g:imported_name_appended
Bram Moolenaard8448622022-01-07 21:39:52 +0000119 delete('Ximport.vim')
120
121 # similar, with line breaks
122 var import_line_break_script_lines =<< trim END
123 vim9script
124 import './Xexport.vim'
125 as expo
126 g:exported = expo.exported
127 expo.exported += 7
128 g:exported_added = expo.exported
129 g:imported_func = expo.Exported()
130 END
131 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
132 source Ximport_lbr.vim
133
134 assert_equal(11, g:exported)
135 assert_equal(18, g:exported_added)
136 assert_equal('Exported', g:imported_func)
137
138 # exported script not sourced again
139 assert_false(exists('g:result'))
140 unlet g:exported
141 unlet g:exported_added
142 unlet g:imported_func
143 delete('Ximport_lbr.vim')
144
145 var line_break_before_dot =<< trim END
146 vim9script
147 import './Xexport.vim' as expo
148 g:exported = expo
149 .exported
150 END
151 writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
152 assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
153 delete('Ximport_lbr_before_dot.vim')
154
155 var line_break_after_dot =<< trim END
156 vim9script
157 import './Xexport.vim' as expo
158 g:exported = expo.
159 exported
160 END
161 writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
162 assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
163 delete('Ximport_lbr_after_dot.vim')
164
165 var import_star_as_lines =<< trim END
166 vim9script
167 import './Xexport.vim' as Export
168 def UseExport()
169 g:exported_def = Export.exported
170 enddef
171 g:exported_script = Export.exported
172 assert_equal(1, exists('Export.exported'))
173 assert_equal(0, exists('Export.notexported'))
174 UseExport()
175 END
176 writefile(import_star_as_lines, 'Ximport.vim')
177 source Ximport.vim
178
179 assert_equal(18, g:exported_def)
180 assert_equal(18, g:exported_script)
181 unlet g:exported_def
182 unlet g:exported_script
183
184 var import_star_as_lines_no_dot =<< trim END
185 vim9script
186 import './Xexport.vim' as Export
187 def Func()
188 var dummy = 1
189 var imported = Export + dummy
190 enddef
191 defcompile
192 END
193 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
194 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
195
196 var import_star_as_lines_dot_space =<< trim END
197 vim9script
198 import './Xexport.vim' as Export
199 def Func()
200 var imported = Export . exported
201 enddef
202 defcompile
203 END
204 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
205 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
206
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000207 writefile(s:export_script_lines, 'Xexport2.vim')
208 var import_as_duplicated =<< trim END
Bram Moolenaard8448622022-01-07 21:39:52 +0000209 vim9script
210 import './Xexport.vim' as expo
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000211 import './Xexport2.vim' as expo
Bram Moolenaard8448622022-01-07 21:39:52 +0000212 END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000213 writefile(import_as_duplicated, 'Ximport.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000214 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000215 delete('Xexport2.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000216
217 var import_star_as_lines_script_no_dot =<< trim END
218 vim9script
219 import './Xexport.vim' as Export
220 g:imported_script = Export exported
221 END
222 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
223 assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
224
225 var import_star_as_lines_script_space_after_dot =<< trim END
226 vim9script
227 import './Xexport.vim' as Export
228 g:imported_script = Export. exported
229 END
230 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
231 assert_fails('source Ximport.vim', 'E1074:')
232
233 var import_star_as_lines_missing_name =<< trim END
234 vim9script
235 import './Xexport.vim' as Export
236 def Func()
237 var imported = Export.
238 enddef
239 defcompile
240 END
241 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
242 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
243
244 var import_star_as_lbr_lines =<< trim END
245 vim9script
246 import './Xexport.vim'
247 as Export
248 def UseExport()
249 g:exported = Export.exported
250 enddef
251 UseExport()
252 END
253 writefile(import_star_as_lbr_lines, 'Ximport.vim')
254 source Ximport.vim
255 assert_equal(18, g:exported)
256 unlet g:exported
257
258 # try to use something that exists but is not exported
259 var import_not_exported_lines =<< trim END
260 vim9script
261 import './Xexport.vim' as expo
262 echo expo.name
263 END
264 writefile(import_not_exported_lines, 'Ximport.vim')
265 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
266
267 # try to import something that is already defined
268 var import_already_defined =<< trim END
269 vim9script
270 var exported = 'something'
271 import './Xexport.vim' as exported
272 END
273 writefile(import_already_defined, 'Ximport.vim')
274 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
275
276 # try changing an imported const
277 var import_assign_to_const =<< trim END
278 vim9script
279 import './Xexport.vim' as expo
280 def Assign()
281 expo.CONST = 987
282 enddef
283 defcompile
284 END
285 writefile(import_assign_to_const, 'Ximport.vim')
286 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
287
288 # try changing an imported final
289 var import_assign_to_final =<< trim END
290 vim9script
291 import './Xexport.vim' as expo
292 def Assign()
293 expo.theList = [2]
294 enddef
295 defcompile
296 END
297 writefile(import_assign_to_final, 'Ximport.vim')
298 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
299
300 var import_no_as_lines =<< trim END
301 vim9script
302 import './Xexport.vim' name
303 END
304 writefile(import_no_as_lines, 'Ximport.vim')
305 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
306
307 var import_invalid_string_lines =<< trim END
308 vim9script
309 import Xexport.vim
310 END
311 writefile(import_invalid_string_lines, 'Ximport.vim')
312 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
313
314 var import_wrong_name_lines =<< trim END
315 vim9script
316 import './XnoExport.vim'
317 END
318 writefile(import_wrong_name_lines, 'Ximport.vim')
319 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
320
321 var import_redefining_lines =<< trim END
322 vim9script
323 import './Xexport.vim' as exported
324 var exported = 5
325 END
326 writefile(import_redefining_lines, 'Ximport.vim')
327 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
328
Bram Moolenaar160aa862022-01-10 21:29:57 +0000329 var import_missing_dot_lines =<< trim END
330 vim9script
331 import './Xexport.vim' as expo
332 def Test()
333 expo = 9
334 enddef
335 defcompile
336 END
337 writefile(import_missing_dot_lines, 'Ximport.vim')
338 assert_fails('source Ximport.vim', 'E1258:', '', 1)
339
340 var import_missing_name_lines =<< trim END
341 vim9script
342 import './Xexport.vim' as expo
343 def Test()
344 expo.99 = 9
345 enddef
346 defcompile
347 END
348 writefile(import_missing_name_lines, 'Ximport.vim')
Bram Moolenaar76283822022-01-10 21:39:03 +0000349 assert_fails('source Ximport.vim', 'E1259:', '', 1)
Bram Moolenaar160aa862022-01-10 21:29:57 +0000350
Bram Moolenaard8448622022-01-07 21:39:52 +0000351 var import_assign_wrong_type_lines =<< trim END
352 vim9script
353 import './Xexport.vim' as expo
354 expo.exported = 'xxx'
355 END
356 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
357 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
358
359 var import_assign_const_lines =<< trim END
360 vim9script
361 import './Xexport.vim' as expo
362 expo.CONST = 4321
363 END
364 writefile(import_assign_const_lines, 'Ximport.vim')
365 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
366
367 delete('Ximport.vim')
368 delete('Ximport3.vim')
369 delete('Xexport.vim')
370
371 # Check that in a Vim9 script 'cpo' is set to the Vim default.
372 # Flags added or removed are also applied to the restored value.
373 set cpo=abcd
374 var lines =<< trim END
375 vim9script
376 g:cpo_in_vim9script = &cpo
377 set cpo+=f
378 set cpo-=c
379 g:cpo_after_vim9script = &cpo
380 END
381 writefile(lines, 'Xvim9_script')
382 source Xvim9_script
383 assert_equal('fabd', &cpo)
384 set cpo&vim
385 assert_equal(&cpo, g:cpo_in_vim9script)
386 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
387 assert_equal(newcpo, g:cpo_after_vim9script)
388
389 delete('Xvim9_script')
390enddef
391
392def Test_import_funcref()
393 var lines =<< trim END
394 vim9script
395 export def F(): number
396 return 42
397 enddef
398 export const G = F
399 END
400 writefile(lines, 'Xlib.vim')
401
402 lines =<< trim END
403 vim9script
404 import './Xlib.vim' as lib
405 const Foo = lib.G()
406 assert_equal(42, Foo)
407
408 def DoTest()
409 const Goo = lib.G()
410 assert_equal(42, Goo)
411 enddef
412 DoTest()
413 END
414 CheckScriptSuccess(lines)
415
416 delete('Xlib.vim')
417enddef
418
419def Test_import_fails()
420 writefile([], 'Xfoo.vim')
421 var lines =<< trim END
422 import './Xfoo.vim' as foo
423 foo = 'bar'
424 END
425 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
426 lines =<< trim END
427 vim9script
428 import './Xfoo.vim' as foo
429 var that = foo
430 END
431 CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000432 lines =<< trim END
433 vim9script
434 import './Xfoo.vim' as foo
435 var that: any
436 that += foo
437 END
438 CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
439 lines =<< trim END
440 vim9script
441 import './Xfoo.vim' as foo
442 foo += 9
443 END
444 CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaard8448622022-01-07 21:39:52 +0000445
446 lines =<< trim END
447 vim9script
448 import './Xfoo.vim' as 9foo
449 END
450 CheckScriptFailure(lines, 'E1047:')
451 lines =<< trim END
452 vim9script
453 import './Xfoo.vim' as the#foo
454 END
455 CheckScriptFailure(lines, 'E1047:')
456 lines =<< trim END
457 vim9script
458 import './Xfoo.vim' as g:foo
459 END
460 CheckScriptFailure(lines, 'E1047:')
461
462 delete('Xfoo.vim')
463
464 lines =<< trim END
465 vim9script
466 def TheFunc()
467 echo 'the func'
468 enddef
469 export var Ref = TheFunc
470 END
471 writefile([], 'Xthat.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000472
Bram Moolenaard8448622022-01-07 21:39:52 +0000473 lines =<< trim END
474 import './Xthat.vim' as That
475 That()
476 END
477 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000478
479 lines =<< trim END
Bram Moolenaar937610b2022-01-19 17:21:29 +0000480 vim9script
481 import './Xthat.vim' as That
482 def Func()
483 echo That()
484 enddef
485 Func()
486 END
487 CheckScriptFailure(lines, 'E1236: Cannot use That itself')
488
489 lines =<< trim END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000490 import './Xthat.vim' as one
491 import './Xthat.vim' as two
492 END
493 CheckScriptFailure(lines, 'E1262:')
494
495 delete('Xthat.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000496
497 mkdir('Ximport')
498
499 writefile(['vim9script'], 'Ximport/.vim')
500 lines =<< trim END
501 vim9script
502 import './Ximport/.vim'
503 END
504 CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
505 lines =<< trim END
506 vim9script
507 import './Ximport/.vim' as vim
508 END
509 CheckScriptSuccess(lines)
510
511 writefile(['vim9script'], 'Ximport/.vimrc')
512 lines =<< trim END
513 vim9script
514 import './Ximport/.vimrc'
515 END
516 CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
517 lines =<< trim END
518 vim9script
519 import './Ximport/.vimrc' as vimrc
520 END
521 CheckScriptSuccess(lines)
522
523 delete('Ximport', 'rf')
524enddef
525
526func g:Trigger()
527 source Ximport.vim
528 return "echo 'yes'\<CR>"
529endfunc
530
531def Test_import_export_expr_map()
532 # check that :import and :export work when buffer is locked
533 var export_lines =<< trim END
534 vim9script
535 export def That(): string
536 return 'yes'
537 enddef
538 END
539 writefile(export_lines, 'Xexport_that.vim')
540
541 var import_lines =<< trim END
542 vim9script
543 import './Xexport_that.vim' as that
544 assert_equal('yes', that.That())
545 END
546 writefile(import_lines, 'Ximport.vim')
547
548 nnoremap <expr> trigger g:Trigger()
549 feedkeys('trigger', "xt")
550
551 delete('Xexport_that.vim')
552 delete('Ximport.vim')
553 nunmap trigger
554enddef
555
556def Test_import_in_filetype()
557 # check that :import works when the buffer is locked
558 mkdir('ftplugin', 'p')
559 var export_lines =<< trim END
560 vim9script
561 export var That = 'yes'
562 END
563 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
564
565 var import_lines =<< trim END
566 vim9script
567 import './Xexport_ft.vim' as ft
568 assert_equal('yes', ft.That)
569 g:did_load_mytpe = 1
570 END
571 writefile(import_lines, 'ftplugin/qf.vim')
572
573 var save_rtp = &rtp
574 &rtp = getcwd() .. ',' .. &rtp
575
576 filetype plugin on
577 copen
578 assert_equal(1, g:did_load_mytpe)
579
580 quit!
581 delete('Xexport_ft.vim')
582 delete('ftplugin', 'rf')
583 &rtp = save_rtp
584enddef
585
586def Test_use_import_in_mapping()
587 var lines =<< trim END
588 vim9script
589 export def Funcx()
590 g:result = 42
591 enddef
592 END
593 writefile(lines, 'XsomeExport.vim')
594 lines =<< trim END
595 vim9script
596 import './XsomeExport.vim' as some
597 var Funcy = some.Funcx
598 nnoremap <F3> :call <sid>Funcy()<cr>
599 END
600 writefile(lines, 'Xmapscript.vim')
601
602 source Xmapscript.vim
603 feedkeys("\<F3>", "xt")
604 assert_equal(42, g:result)
605
606 unlet g:result
607 delete('XsomeExport.vim')
608 delete('Xmapscript.vim')
609 nunmap <F3>
610enddef
611
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000612def Test_use_import_in_command_completion()
Bram Moolenaar15d16352022-01-17 20:09:08 +0000613 var lines =<< trim END
614 vim9script
615 export def Complete(..._): list<string>
616 return ['abcd']
617 enddef
618 END
619 writefile(lines, 'Xscript.vim')
620
621 lines =<< trim END
622 vim9script
623 import './Xscript.vim'
624
625 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
626 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
627 assert_equal('#Cmd abcd', @:)
628 END
629 CheckScriptSuccess(lines)
630
631 delcommand Cmd
632 delete('Xscript.vim')
633enddef
634
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000635def Test_use_autoload_import_in_insert_completion()
636 mkdir('Xdir/autoload', 'p')
637 var save_rtp = &rtp
638 exe 'set rtp^=' .. getcwd() .. '/Xdir'
639
640 var lines =<< trim END
641 vim9script
642 export def ThesaurusFunc(findbase: bool, _): any
643 if findbase
644 return 1
645 endif
646 return [
647 'check',
648 'experiment',
649 'test',
650 'verification'
651 ]
652 enddef
653 g:completion_loaded = 'yes'
654 END
655 writefile(lines, 'Xdir/autoload/completion.vim')
656
657 new
658 lines =<< trim END
659 vim9script
660 g:completion_loaded = 'no'
661 import autoload 'completion.vim'
662 set thesaurusfunc=completion.ThesaurusFunc
663 assert_equal('no', g:completion_loaded)
664 feedkeys("i\<C-X>\<C-T>\<C-N>\<Esc>", 'xt')
665 assert_equal('experiment', getline(1))
666 assert_equal('yes', g:completion_loaded)
667 END
668 CheckScriptSuccess(lines)
669
670 set thesaurusfunc=
671 bwipe!
672 delete('Xdir', 'rf')
673 &rtp = save_rtp
674enddef
675
Bram Moolenaare70dd112022-01-21 16:31:11 +0000676def Test_use_autoload_import_in_fold_expression()
677 mkdir('Xdir/autoload', 'p')
678 var save_rtp = &rtp
679 exe 'set rtp^=' .. getcwd() .. '/Xdir'
680
681 var lines =<< trim END
682 vim9script
683 export def Expr(): string
684 return getline(v:lnum) =~ '^#' ? '>1' : '1'
685 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000686 export def Text(): string
687 return 'fold text'
688 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000689 g:fold_loaded = 'yes'
690 END
691 writefile(lines, 'Xdir/autoload/fold.vim')
692
693 lines =<< trim END
694 vim9script
695 import autoload 'fold.vim'
696 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000697 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000698 &foldmethod = 'expr'
699 &debug = 'throw'
700 END
701 new
702 setline(1, ['# one', 'text', '# two', 'text'])
703 g:fold_loaded = 'no'
704 CheckScriptSuccess(lines)
705 assert_equal('no', g:fold_loaded)
706 redraw
707 assert_equal('yes', g:fold_loaded)
708
709 # Check that script context of 'foldexpr' is copied to another buffer.
710 edit! otherfile
711 redraw
712
Bram Moolenaar9530b582022-01-22 13:39:08 +0000713 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +0000714 bwipe!
715 delete('Xdir', 'rf')
716 &rtp = save_rtp
717enddef
718
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +0000719func Test_import_in_diffexpr()
720 CheckExecutable diff
721
722 call Run_Test_import_in_diffexpr()
723endfunc
724
725def Run_Test_import_in_diffexpr()
726 var lines =<< trim END
727 vim9script
728
729 export def DiffExpr()
730 # Prepend some text to check diff type detection
731 writefile(['warning', ' message'], v:fname_out)
732 silent exe '!diff ' .. v:fname_in .. ' '
733 .. v:fname_new .. '>>' .. v:fname_out
734 enddef
735 END
736 writefile(lines, 'Xdiffexpr')
737
738 lines =<< trim END
739 vim9script
740 import './Xdiffexpr' as diff
741
742 set diffexpr=diff.DiffExpr()
743 set diffopt=foldcolumn:0
744 END
745 CheckScriptSuccess(lines)
746
747 enew!
748 call setline(1, ['one', 'two', 'three'])
749 diffthis
750
751 botright vert new
752 call setline(1, ['one', 'two', 'three.'])
753 diffthis
754 # we only check if this does not cause errors
755 redraw
756
757 diffoff!
758 bwipe!
759 bwipe!
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +0000760 delete('Xdiffexpr')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +0000761enddef
762
Bram Moolenaar36c2add2022-01-22 20:55:30 +0000763def Test_import_in_patchexpr()
764 var lines =<< trim END
765 vim9script
766 export def TPatch()
767 call writefile(['output file'], v:fname_out)
768 enddef
769 END
770 writefile(lines, 'Xpatchexpr')
771
772 lines =<< trim END
773 vim9script
774 import './Xpatchexpr' as patch
775 set patchexpr=patch.TPatch()
776 END
777 CheckScriptSuccess(lines)
778
779 call writefile(['input file'], 'Xinput')
780 call writefile(['diff file'], 'Xdiff')
781 :%bwipe!
782 edit Xinput
783 diffpatch Xdiff
784 call assert_equal('output file', getline(1))
785
786 call delete('Xinput')
787 call delete('Xdiff')
788 call delete('Xpatchexpr')
789 set patchexpr&
790 :%bwipe!
791enddef
792
Bram Moolenaar3ba685e2022-01-22 19:17:31 +0000793def Test_import_in_formatexpr()
794 var lines =<< trim END
795 vim9script
796 export def MyFormatExpr(): number
797 g:did_format = 'yes'
798 return 0
799 enddef
800 END
801 writefile(lines, 'Xformatter')
802
803 lines =<< trim END
804 vim9script
805 import './Xformatter' as format
806 set formatexpr=format.MyFormatExpr()
807 END
808 CheckScriptSuccess(lines)
809
810 new
811 setline(1, ['a', 'b', 'c'])
812 normal gqG
813 assert_equal('yes', g:did_format)
814
815 bwipe!
816 delete('Xformatter')
817 unlet g:did_format
818 set formatexpr=
819enddef
820
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +0000821def Test_import_in_includeexpr()
822 writefile(['found it'], 'Xthisfile')
823 new
824
825 var lines =<< trim END
826 vim9script
827 export def DoSub(): string
828 return substitute(v:fname, 'that', 'this', '')
829 enddef
830 END
831 writefile(lines, 'Xinclude.vim')
832
833 lines =<< trim END
834 vim9script
835 import './Xinclude.vim'
836 set includeexpr=Xinclude.DoSub()
837 END
838 CheckScriptSuccess(lines)
839
840 setline(1, ['Xthatfile'])
841 exe "normal \<C-W>f"
842 assert_equal('Xthisfile', expand('%'))
843
844 bwipe!
845 bwipe!
846 set includeexpr=
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +0000847 delete('Xinclude.vim')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +0000848 delete('Xthisfile')
849enddef
850
Bram Moolenaar28e60cc2022-01-22 20:32:00 +0000851def Test_import_in_indentexpr()
852 var lines =<< trim END
853 vim9script
854 export def GetIndent(): number
855 return 5
856 enddef
857 END
858 writefile(lines, 'Xindenter')
859
860 lines =<< trim END
861 vim9script
862 import './Xindenter' as indent
863 set indentexpr=indent.GetIndent()
864 set debug=throw
865 END
866 CheckScriptSuccess(lines)
867
868 new
869 setline(1, 'hello')
870 normal ==
871 assert_equal(' hello', getline(1))
872
873 bwipe!
874 set indentexpr= debug=
875 delete('Xindenter')
876enddef
877
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +0000878func Test_import_in_printexpr()
879 CheckFeature postscript
880 call Run_Test_import_in_printexpr()
881endfunc
882
883def Run_Test_import_in_printexpr()
884 var lines =<< trim END
885 vim9script
886 export def PrintFile(): bool
887 g:printed = 'yes'
888 delete('v:fname_in')
889 return false
890 enddef
891 END
892 writefile(lines, 'Xprint.vim')
893
894 lines =<< trim END
895 vim9script
896 import './Xprint.vim'
897 set printexpr=Xprint.PrintFile()
898 END
899 CheckScriptSuccess(lines)
900
901 help
902 hardcopy dummy args
903 assert_equal('yes', g:printed)
904
905 delete('Xprint.vim')
906 set printexpr=
907enddef
908
Bram Moolenaarf4e88f22022-01-23 14:17:28 +0000909def Test_import_in_charconvert()
910 var lines =<< trim END
911 vim9script
912 export def MakeUpper(): bool
913 var data = readfile(v:fname_in)
914 map(data, 'toupper(v:val)')
915 writefile(data, v:fname_out)
916 return false # success
917 enddef
918 END
919 writefile(lines, 'Xconvert.vim')
920
921 lines =<< trim END
922 vim9script
923 import './Xconvert.vim' as conv
924 set charconvert=conv.MakeUpper()
925 END
926 CheckScriptSuccess(lines)
927
928 writefile(['one', 'two'], 'Xfile')
929 new Xfile
930 write ++enc=ucase Xfile1
931 assert_equal(['ONE', 'TWO'], readfile('Xfile1'))
932
933 delete('Xfile')
934 delete('Xfile1')
935 delete('Xconvert.vim')
936 bwipe!
937 set charconvert&
938enddef
939
Bram Moolenaar2a7aa832022-01-23 17:59:06 +0000940func Test_import_in_spellsuggest_expr()
941 CheckFeature spell
942 call Run_Test_import_in_spellsuggest_expr()
943endfunc
944
945def Run_Test_import_in_spellsuggest_expr()
946 var lines =<< trim END
947 vim9script
948 export def MySuggest(): list<any>
949 return [['Fox', 8], ['Fop', 9]]
950 enddef
951 END
952 writefile(lines, 'Xsuggest.vim')
953
954 lines =<< trim END
955 vim9script
956 import './Xsuggest.vim' as sugg
957 set spell spellsuggest=expr:sugg.MySuggest()
958 END
959 CheckScriptSuccess(lines)
960
961 set verbose=1 # report errors
962 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
963
964 delete('Xsuggest.vim')
965 set nospell spellsuggest& verbose=0
966enddef
967
Bram Moolenaaracc4b562022-01-24 13:54:45 +0000968def Test_export_shadows_global_function()
969 mkdir('Xdir/autoload', 'p')
970 var save_rtp = &rtp
971 exe 'set rtp^=' .. getcwd() .. '/Xdir'
972
973 var lines =<< trim END
974 vim9script
975 export def Shadow(): string
976 return 'Shadow()'
977 enddef
978 END
979 writefile(lines, 'Xdir/autoload/shadow.vim')
980
981 lines =<< trim END
982 vim9script
983
984 def g:Shadow(): string
985 return 'global'
986 enddef
987
988 import autoload 'shadow.vim'
989 assert_equal('Shadow()', shadow.Shadow())
990 END
991 CheckScriptSuccess(lines)
992
993 delfunc g:Shadow
994 bwipe!
995 delete('Xdir', 'rf')
996 &rtp = save_rtp
997enddef
998
Bram Moolenaard8448622022-01-07 21:39:52 +0000999def Test_export_fails()
1000 CheckScriptFailure(['export var some = 123'], 'E1042:')
1001 CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1002 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1003
1004 assert_fails('export something', 'E1043:')
1005enddef
1006
1007func Test_import_fails_without_script()
1008 CheckRunVimInTerminal
1009
1010 " call indirectly to avoid compilation error for missing functions
1011 call Run_Test_import_fails_on_command_line()
1012endfunc
1013
1014def Run_Test_import_fails_on_command_line()
1015 var export =<< trim END
1016 vim9script
1017 export def Foo(): number
1018 return 0
1019 enddef
1020 END
1021 writefile(export, 'XexportCmd.vim')
1022
1023 var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
1024 rows: 6, wait_for_ruler: 0})
1025 WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1026
1027 delete('XexportCmd.vim')
1028 StopVimInTerminal(buf)
1029enddef
1030
1031def Test_vim9_reload_noclear()
1032 var lines =<< trim END
1033 vim9script
1034 export var exported = 'thexport'
1035
1036 export def TheFunc(x = 0)
1037 enddef
1038 END
1039 writefile(lines, 'XExportReload')
1040 lines =<< trim END
1041 vim9script noclear
1042 g:loadCount += 1
1043 var s:reloaded = 'init'
1044 import './XExportReload' as exp
1045
1046 def Again(): string
1047 return 'again'
1048 enddef
1049
1050 exp.TheFunc()
1051
1052 if exists('s:loaded') | finish | endif
1053 var s:loaded = true
1054
1055 var s:notReloaded = 'yes'
1056 s:reloaded = 'first'
1057 def g:Values(): list<string>
1058 return [s:reloaded, s:notReloaded, Again(), Once(), exp.exported]
1059 enddef
1060
1061 def Once(): string
1062 return 'once'
1063 enddef
1064 END
1065 writefile(lines, 'XReloaded')
1066 g:loadCount = 0
1067 source XReloaded
1068 assert_equal(1, g:loadCount)
1069 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1070 source XReloaded
1071 assert_equal(2, g:loadCount)
1072 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1073 source XReloaded
1074 assert_equal(3, g:loadCount)
1075 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1076
1077 delete('XReloaded')
1078 delete('XExportReload')
1079 delfunc g:Values
1080 unlet g:loadCount
1081
1082 lines =<< trim END
1083 vim9script
1084 def Inner()
1085 enddef
1086 END
1087 lines->writefile('XreloadScript.vim')
1088 source XreloadScript.vim
1089
1090 lines =<< trim END
1091 vim9script
1092 def Outer()
1093 def Inner()
1094 enddef
1095 enddef
1096 defcompile
1097 END
1098 lines->writefile('XreloadScript.vim')
1099 source XreloadScript.vim
1100
1101 delete('XreloadScript.vim')
1102enddef
1103
1104def Test_vim9_reload_import()
1105 var lines =<< trim END
1106 vim9script
1107 const var = ''
1108 var valone = 1234
1109 def MyFunc(arg: string)
1110 valone = 5678
1111 enddef
1112 END
1113 var morelines =<< trim END
1114 var valtwo = 222
1115 export def GetValtwo(): number
1116 return valtwo
1117 enddef
1118 END
1119 writefile(lines + morelines, 'Xreload.vim')
1120 source Xreload.vim
1121 source Xreload.vim
1122 source Xreload.vim
1123
1124 # cannot declare a var twice
1125 lines =<< trim END
1126 vim9script
1127 var valone = 1234
1128 var valone = 5678
1129 END
1130 writefile(lines, 'Xreload.vim')
1131 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1132
1133 delete('Xreload.vim')
1134 delete('Ximport.vim')
1135enddef
1136
1137" if a script is reloaded with a script-local variable that changed its type, a
1138" compiled function using that variable must fail.
1139def Test_script_reload_change_type()
1140 var lines =<< trim END
1141 vim9script noclear
1142 var str = 'string'
1143 def g:GetStr(): string
1144 return str .. 'xxx'
1145 enddef
1146 END
1147 writefile(lines, 'Xreload.vim')
1148 source Xreload.vim
1149 echo g:GetStr()
1150
1151 lines =<< trim END
1152 vim9script noclear
1153 var str = 1234
1154 END
1155 writefile(lines, 'Xreload.vim')
1156 source Xreload.vim
1157 assert_fails('echo g:GetStr()', 'E1150:')
1158
1159 delfunc g:GetStr
1160 delete('Xreload.vim')
1161enddef
1162
1163" Define CallFunc so that the test can be compiled
1164command CallFunc echo 'nop'
1165
1166def Test_script_reload_from_function()
1167 var lines =<< trim END
1168 vim9script
1169
1170 if exists('g:loaded')
1171 finish
1172 endif
1173 g:loaded = 1
1174 delcommand CallFunc
1175 command CallFunc Func()
1176 def Func()
1177 so XreloadFunc.vim
1178 g:didTheFunc = 1
1179 enddef
1180 END
1181 writefile(lines, 'XreloadFunc.vim')
1182 source XreloadFunc.vim
1183 CallFunc
1184 assert_equal(1, g:didTheFunc)
1185
1186 delete('XreloadFunc.vim')
1187 delcommand CallFunc
1188 unlet g:loaded
1189 unlet g:didTheFunc
1190enddef
1191
1192def s:RetSome(): string
1193 return 'some'
1194enddef
1195
1196" Not exported function that is referenced needs to be accessed by the
1197" script-local name.
1198def Test_vim9_funcref()
1199 var sortlines =<< trim END
1200 vim9script
1201 def Compare(i1: number, i2: number): number
1202 return i2 - i1
1203 enddef
1204
1205 export def FastSort(): list<number>
1206 return range(5)->sort(Compare)
1207 enddef
1208
1209 export def GetString(arg: string): string
1210 return arg
1211 enddef
1212 END
1213 writefile(sortlines, 'Xsort.vim')
1214
1215 var lines =<< trim END
1216 vim9script
1217 import './Xsort.vim'
1218 def Test()
1219 g:result = Xsort.FastSort()
1220 enddef
1221 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001222 END
1223 writefile(lines, 'Xscript.vim')
1224 source Xscript.vim
1225 assert_equal([4, 3, 2, 1, 0], g:result)
1226 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00001227
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001228 lines =<< trim END
1229 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00001230 # using a function imported with "as"
1231 import './Xsort.vim' as anAlias
1232 assert_equal('yes', anAlias.GetString('yes'))
1233
1234 # using the function from a compiled function
1235 def TestMore(): string
1236 var s = s:anAlias.GetString('foo')
1237 return s .. anAlias.GetString('bar')
1238 enddef
1239 assert_equal('foobar', TestMore())
1240
1241 # error when using a function that isn't exported
1242 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1243 END
1244 writefile(lines, 'Xscript.vim')
1245
Bram Moolenaard8448622022-01-07 21:39:52 +00001246 delete('Xsort.vim')
1247 delete('Xscript.vim')
1248
1249 var Funcref = function('s:RetSome')
1250 assert_equal('some', Funcref())
1251enddef
1252
1253" Check that when searching for "FilterFunc" it finds the import in the
1254" script where FastFilter() is called from, both as a string and as a direct
1255" function reference.
1256def Test_vim9_funcref_other_script()
1257 var filterLines =<< trim END
1258 vim9script
1259 export def FilterFunc(idx: number, val: number): bool
1260 return idx % 2 == 1
1261 enddef
1262 export def FastFilter(): list<number>
1263 return range(10)->filter('FilterFunc(v:key, v:val)')
1264 enddef
1265 export def FastFilterDirect(): list<number>
1266 return range(10)->filter(FilterFunc)
1267 enddef
1268 END
1269 writefile(filterLines, 'Xfilter.vim')
1270
1271 var lines =<< trim END
1272 vim9script
1273 import './Xfilter.vim' as filter
1274 def Test()
1275 var x: list<number> = filter.FastFilter()
1276 enddef
1277 Test()
1278 def TestDirect()
1279 var x: list<number> = filter.FastFilterDirect()
1280 enddef
1281 TestDirect()
1282 END
1283 CheckScriptSuccess(lines)
1284 delete('Xfilter.vim')
1285enddef
1286
1287def Test_import_absolute()
1288 var import_lines = [
1289 'vim9script',
1290 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
1291 'def UseExported()',
1292 ' g:imported_abs = abs.exported',
1293 ' abs.exported = 8888',
1294 ' g:imported_after = abs.exported',
1295 'enddef',
1296 'UseExported()',
1297 'g:import_disassembled = execute("disass UseExported")',
1298 ]
1299 writefile(import_lines, 'Ximport_abs.vim')
1300 writefile(s:export_script_lines, 'Xexport_abs.vim')
1301
1302 source Ximport_abs.vim
1303
1304 assert_equal(9876, g:imported_abs)
1305 assert_equal(8888, g:imported_after)
1306 assert_match('<SNR>\d\+_UseExported\_s*' ..
1307 'g:imported_abs = abs.exported\_s*' ..
1308 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1309 '1 STOREG g:imported_abs\_s*' ..
1310 'abs.exported = 8888\_s*' ..
1311 '2 PUSHNR 8888\_s*' ..
1312 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1313 'g:imported_after = abs.exported\_s*' ..
1314 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1315 '5 STOREG g:imported_after',
1316 g:import_disassembled)
1317
1318 Undo_export_script_lines()
1319 unlet g:imported_abs
1320 unlet g:import_disassembled
1321
1322 delete('Ximport_abs.vim')
1323 delete('Xexport_abs.vim')
1324enddef
1325
1326def Test_import_rtp()
1327 var import_lines = [
1328 'vim9script',
1329 'import "Xexport_rtp.vim" as rtp',
1330 'g:imported_rtp = rtp.exported',
1331 ]
1332 writefile(import_lines, 'Ximport_rtp.vim')
1333 mkdir('import', 'p')
1334 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1335
1336 var save_rtp = &rtp
1337 &rtp = getcwd()
1338 source Ximport_rtp.vim
1339 &rtp = save_rtp
1340
1341 assert_equal(9876, g:imported_rtp)
1342
1343 Undo_export_script_lines()
1344 unlet g:imported_rtp
1345 delete('Ximport_rtp.vim')
1346 delete('import', 'rf')
1347enddef
1348
1349def Test_import_compile_error()
1350 var export_lines = [
1351 'vim9script',
1352 'export def ExpFunc(): string',
1353 ' return notDefined',
1354 'enddef',
1355 ]
1356 writefile(export_lines, 'Xexported.vim')
1357
1358 var import_lines = [
1359 'vim9script',
1360 'import "./Xexported.vim" as expo',
1361 'def ImpFunc()',
1362 ' echo expo.ExpFunc()',
1363 'enddef',
1364 'defcompile',
1365 ]
1366 writefile(import_lines, 'Ximport.vim')
1367
1368 try
1369 source Ximport.vim
1370 catch /E1001/
1371 # Error should be before the Xexported.vim file.
1372 assert_match('E1001: Variable not found: notDefined', v:exception)
1373 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1374 endtry
1375
1376 delete('Xexported.vim')
1377 delete('Ximport.vim')
1378enddef
1379
1380def Test_func_overrules_import_fails()
1381 var export_lines =<< trim END
1382 vim9script
1383 export def Func()
1384 echo 'imported'
1385 enddef
1386 END
1387 writefile(export_lines, 'XexportedFunc.vim')
1388
1389 var lines =<< trim END
1390 vim9script
1391 import './XexportedFunc.vim' as Func
1392 def Func()
1393 echo 'local to function'
1394 enddef
1395 END
Bram Moolenaar937610b2022-01-19 17:21:29 +00001396 CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00001397
1398 lines =<< trim END
1399 vim9script
1400 import './XexportedFunc.vim' as Func
1401 def Outer()
1402 def Func()
1403 echo 'local to function'
1404 enddef
1405 enddef
1406 defcompile
1407 END
1408 CheckScriptFailure(lines, 'E1236:')
1409
1410 delete('XexportedFunc.vim')
1411enddef
1412
1413def Test_source_vim9_from_legacy()
1414 var vim9_lines =<< trim END
1415 vim9script
1416 var local = 'local'
1417 g:global = 'global'
1418 export var exported = 'exported'
1419 export def GetText(): string
1420 return 'text'
1421 enddef
1422 END
1423 writefile(vim9_lines, 'Xvim9_script.vim')
1424
1425 var legacy_lines =<< trim END
1426 source Xvim9_script.vim
1427
1428 call assert_false(exists('local'))
1429 call assert_false(exists('exported'))
1430 call assert_false(exists('s:exported'))
1431 call assert_equal('global', global)
1432 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00001433 END
1434 writefile(legacy_lines, 'Xlegacy_script.vim')
1435
1436 source Xlegacy_script.vim
1437 assert_equal('global', g:global)
1438 unlet g:global
1439
1440 delete('Xlegacy_script.vim')
1441 delete('Xvim9_script.vim')
1442enddef
1443
Bram Moolenaarc43e6232022-01-13 20:51:56 +00001444def Test_import_vim9_from_legacy()
1445 var vim9_lines =<< trim END
1446 vim9script
1447 var local = 'local'
1448 g:global = 'global'
1449 export var exported = 'exported'
1450 export def GetText(): string
1451 return 'text'
1452 enddef
1453 END
1454 writefile(vim9_lines, 'Xvim9_export.vim')
1455
1456 var legacy_lines =<< trim END
1457 import './Xvim9_export.vim' as vim9
1458
1459 call assert_false(exists('vim9'))
1460 call assert_false(exists('local'))
1461 call assert_false(exists('s:vim9.local'))
1462 call assert_equal('global', global)
1463 call assert_equal('global', g:global)
1464 call assert_false(exists('exported'))
1465 call assert_false(exists('s:exported'))
1466 call assert_false(exists('*GetText'))
1467
1468 " imported symbol is script-local
1469 call assert_equal('exported', s:vim9.exported)
1470 call assert_equal('text', s:vim9.GetText())
1471 END
1472 writefile(legacy_lines, 'Xlegacy_script.vim')
1473
1474 source Xlegacy_script.vim
1475 assert_equal('global', g:global)
1476 unlet g:global
1477
1478 delete('Xlegacy_script.vim')
1479 delete('Xvim9_export.vim')
1480enddef
1481
Bram Moolenaard8448622022-01-07 21:39:52 +00001482def Test_cmdline_win()
1483 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
1484 # the command line window.
1485 mkdir('rtp/syntax', 'p')
1486 var export_lines =<< trim END
1487 vim9script
1488 export var That = 'yes'
1489 END
1490 writefile(export_lines, 'rtp/syntax/Xexport.vim')
1491 var import_lines =<< trim END
1492 vim9script
1493 import './Xexport.vim' as exp
1494 echo exp.That
1495 END
1496 writefile(import_lines, 'rtp/syntax/vim.vim')
1497 var save_rtp = &rtp
1498 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
1499 syntax on
1500 augroup CmdWin
1501 autocmd CmdwinEnter * g:got_there = 'yes'
1502 augroup END
1503 # this will open and also close the cmdline window
1504 feedkeys('q:', 'xt')
1505 assert_equal('yes', g:got_there)
1506
1507 augroup CmdWin
1508 au!
1509 augroup END
1510 &rtp = save_rtp
1511 delete('rtp', 'rf')
1512enddef
1513
1514def Test_import_gone_when_sourced_twice()
1515 var exportlines =<< trim END
1516 vim9script
1517 if exists('g:guard')
1518 finish
1519 endif
1520 g:guard = 1
1521 export var name = 'someName'
1522 END
1523 writefile(exportlines, 'XexportScript.vim')
1524
1525 var lines =<< trim END
1526 vim9script
1527 import './XexportScript.vim' as expo
1528 def g:GetName(): string
1529 return expo.name
1530 enddef
1531 END
1532 writefile(lines, 'XscriptImport.vim')
1533 so XscriptImport.vim
1534 assert_equal('someName', g:GetName())
1535
1536 so XexportScript.vim
1537 assert_fails('call g:GetName()', 'E1149:')
1538
1539 delfunc g:GetName
1540 delete('XexportScript.vim')
1541 delete('XscriptImport.vim')
1542 unlet g:guard
1543enddef
1544
Bram Moolenaar160aa862022-01-10 21:29:57 +00001545" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001546def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00001547 var lines =<< trim END
1548 vim9script
1549 def some#gettest(): string
1550 return 'test'
1551 enddef
1552 g:some#name = 'name'
1553 g:some#dict = {key: 'value'}
1554
1555 def some#varargs(a1: string, ...l: list<string>): string
1556 return a1 .. l[0] .. l[1]
1557 enddef
1558 END
1559
1560 mkdir('Xdir/autoload', 'p')
1561 writefile(lines, 'Xdir/autoload/some.vim')
1562 var save_rtp = &rtp
1563 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1564
1565 assert_equal('test', g:some#gettest())
1566 assert_equal('name', g:some#name)
1567 assert_equal('value', g:some#dict.key)
1568 g:some#other = 'other'
1569 assert_equal('other', g:some#other)
1570
1571 assert_equal('abc', some#varargs('a', 'b', 'c'))
1572
1573 # upper case script name works
1574 lines =<< trim END
1575 vim9script
1576 def Other#getOther(): string
1577 return 'other'
1578 enddef
1579 END
1580 writefile(lines, 'Xdir/autoload/Other.vim')
1581 assert_equal('other', g:Other#getOther())
1582
1583 delete('Xdir', 'rf')
1584 &rtp = save_rtp
1585enddef
1586
1587def Test_vim9script_autoload()
1588 mkdir('Xdir/autoload', 'p')
1589 var save_rtp = &rtp
1590 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1591
Bram Moolenaarfd218c82022-01-18 16:26:24 +00001592 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00001593 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00001594 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001595 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00001596
1597 export def Gettest(): string
1598 return 'test'
1599 enddef
1600
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001601 export var name = 'name'
1602
1603 export func GetFunc()
1604 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00001605 endfunc
1606
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001607 export def GetDef(): string
1608 return Gettest() .. 'more' .. name
1609 enddef
1610
Bram Moolenaar160aa862022-01-10 21:29:57 +00001611 export final fname = 'final'
1612 export const cname = 'const'
1613 END
1614 writefile(lines, 'Xdir/autoload/prefixed.vim')
1615
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001616 g:prefixed_loaded = 0
1617 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00001618 lines =<< trim END
1619 vim9script
1620 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001621 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001622 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001623 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001624
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001625 assert_equal('testmorename', prefixed.GetFunc())
1626 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00001627 assert_equal('name', prefixed.name)
1628 assert_equal('final', prefixed.fname)
1629 assert_equal('const', prefixed.cname)
1630 END
1631 CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001632 # can source it again, autoload script not loaded again
1633 g:expected_loaded = 1
1634 CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001635
1636 # can also get the items by autoload name
1637 lines =<< trim END
1638 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001639 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00001640 call assert_equal('name', prefixed#name)
1641 call assert_equal('final', prefixed#fname)
1642 call assert_equal('const', prefixed#cname)
1643 END
1644 CheckScriptSuccess(lines)
1645
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001646 unlet g:prefixed_loaded
1647 unlet g:expected_loaded
1648 delete('Xdir', 'rf')
1649 &rtp = save_rtp
1650enddef
1651
Bram Moolenaard02dce22022-01-18 17:43:04 +00001652def Test_import_autoload_not_exported()
1653 mkdir('Xdir/autoload', 'p')
1654 var save_rtp = &rtp
1655 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1656
1657 # error when using an item that is not exported from an autoload script
1658 var exportLines =<< trim END
1659 vim9script
1660 var notExported = 123
1661 def NotExport()
1662 echo 'nop'
1663 enddef
1664 END
1665 writefile(exportLines, 'Xdir/autoload/notExport1.vim')
1666
1667 var lines =<< trim END
1668 vim9script
1669 import autoload 'notExport1.vim'
1670 echo notExport1.notFound
1671 END
1672 CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
1673
1674 lines =<< trim END
1675 vim9script
1676 import autoload 'notExport1.vim'
1677 echo notExport1.notExported
1678 END
1679 CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
1680
1681 lines =<< trim END
1682 vim9script
1683 import autoload 'notExport1.vim'
1684 echo notExport1.NotFunc()
1685 END
1686 CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
1687
1688 lines =<< trim END
1689 vim9script
1690 import autoload 'notExport1.vim'
1691 echo notExport1.NotExport()
1692 END
1693 CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
1694
1695 lines =<< trim END
1696 vim9script
1697 import autoload 'notExport1.vim'
1698 echo 'text'->notExport1.NotFunc()
1699 END
1700 CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
1701
1702 lines =<< trim END
1703 vim9script
1704 import autoload 'notExport1.vim'
1705 echo 'text'->notExport1.NotExport()
1706 END
1707 CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
1708
1709 # using a :def function we use a different autoload script every time so that
1710 # the function is compiled without the script loaded
1711 writefile(exportLines, 'Xdir/autoload/notExport2.vim')
1712 lines =<< trim END
1713 vim9script
1714 import autoload 'notExport2.vim'
1715 def Testit()
1716 echo notExport2.notFound
1717 enddef
1718 Testit()
1719 END
1720 CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
1721
1722 writefile(exportLines, 'Xdir/autoload/notExport3.vim')
1723 lines =<< trim END
1724 vim9script
1725 import autoload 'notExport3.vim'
1726 def Testit()
1727 echo notExport3.notExported
1728 enddef
1729 Testit()
1730 END
1731 # don't get E1049 because it is too complicated to figure out
1732 CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
1733
1734 writefile(exportLines, 'Xdir/autoload/notExport4.vim')
1735 lines =<< trim END
1736 vim9script
1737 import autoload 'notExport4.vim'
1738 def Testit()
1739 echo notExport4.NotFunc()
1740 enddef
1741 Testit()
1742 END
1743 CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
1744
1745 writefile(exportLines, 'Xdir/autoload/notExport5.vim')
1746 lines =<< trim END
1747 vim9script
1748 import autoload 'notExport5.vim'
1749 def Testit()
1750 echo notExport5.NotExport()
1751 enddef
1752 Testit()
1753 END
1754 CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
1755
1756 writefile(exportLines, 'Xdir/autoload/notExport6.vim')
1757 lines =<< trim END
1758 vim9script
1759 import autoload 'notExport6.vim'
1760 def Testit()
1761 echo 'text'->notExport6.NotFunc()
1762 enddef
1763 Testit()
1764 END
1765 CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
1766
1767 writefile(exportLines, 'Xdir/autoload/notExport7.vim')
1768 lines =<< trim END
1769 vim9script
1770 import autoload 'notExport7.vim'
1771 def Testit()
1772 echo 'text'->notExport7.NotExport()
1773 enddef
1774 Testit()
1775 END
1776 CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
1777
1778 delete('Xdir', 'rf')
1779 &rtp = save_rtp
1780enddef
1781
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001782def Test_vim9script_autoload_call()
1783 mkdir('Xdir/autoload', 'p')
1784 var save_rtp = &rtp
1785 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1786
1787 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00001788 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001789
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00001790 export def RetArg(arg: string): string
1791 return arg
1792 enddef
1793
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001794 export def Getother()
1795 g:result = 'other'
1796 enddef
1797 END
Bram Moolenaar5d982692022-01-12 15:15:27 +00001798 writefile(lines, 'Xdir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001799
1800 lines =<< trim END
1801 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00001802 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00001803
1804 # compile this before 'another.vim' is loaded
1805 def CallAnother()
1806 assert_equal('foo', 'foo'->another.RetArg())
1807 enddef
1808 CallAnother()
1809
Bram Moolenaar5d982692022-01-12 15:15:27 +00001810 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001811 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00001812
1813 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001814 END
1815 CheckScriptSuccess(lines)
1816
1817 unlet g:result
Bram Moolenaar160aa862022-01-10 21:29:57 +00001818 delete('Xdir', 'rf')
1819 &rtp = save_rtp
1820enddef
1821
Bram Moolenaarb697dc22022-01-22 11:27:29 +00001822def Test_vim9script_noclear_autoload()
1823 mkdir('Xdir/autoload', 'p')
1824 var save_rtp = &rtp
1825 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1826
1827 var lines =<< trim END
1828 vim9script
1829 export def Func(): string
1830 return 'called'
1831 enddef
1832 g:double_loaded = 'yes'
1833 END
1834 writefile(lines, 'Xdir/autoload/double.vim')
1835
1836 lines =<< trim END
1837 vim9script noclear
1838 if exists('g:script_loaded')
1839 finish
1840 endif
1841 g:script_loaded = true
1842
1843 import autoload 'double.vim'
1844 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
1845 END
1846 g:double_loaded = 'no'
1847 writefile(lines, 'Xloaddouble')
1848 source Xloaddouble
1849 assert_equal('no', g:double_loaded)
1850 assert_equal(true, g:script_loaded)
1851 source Xloaddouble
1852 feedkeys("\<F3>", 'xt')
1853 assert_equal('called', g:result)
1854 assert_equal('yes', g:double_loaded)
1855
1856 delete('Xloaddouble')
1857 unlet g:double_loaded
1858 unlet g:script_loaded
1859 unlet g:result
1860 delete('Xdir', 'rf')
1861 &rtp = save_rtp
1862enddef
1863
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00001864def Test_vim9script_autoload_duplicate()
1865 mkdir('Xdir/autoload', 'p')
1866
1867 var lines =<< trim END
1868 vim9script
1869
1870 export def Func()
1871 enddef
1872
1873 def Func()
1874 enddef
1875 END
1876 writefile(lines, 'Xdir/autoload/dupfunc.vim')
1877 assert_fails('source Xdir/autoload/dupfunc.vim', 'E1073:')
1878
1879 lines =<< trim END
1880 vim9script
1881
1882 def Func()
1883 enddef
1884
1885 export def Func()
1886 enddef
1887 END
1888 writefile(lines, 'Xdir/autoload/dup2func.vim')
1889 assert_fails('source Xdir/autoload/dup2func.vim', 'E1073:')
1890
1891 lines =<< trim END
1892 vim9script
1893
1894 def Func()
1895 enddef
1896
1897 export var Func = 'asdf'
1898 END
1899 writefile(lines, 'Xdir/autoload/dup3func.vim')
1900 assert_fails('source Xdir/autoload/dup3func.vim', 'E1041: Redefining script item Func')
1901
1902 lines =<< trim END
1903 vim9script
1904
1905 export var Func = 'asdf'
1906
1907 def Func()
1908 enddef
1909 END
1910 writefile(lines, 'Xdir/autoload/dup4func.vim')
1911 assert_fails('source Xdir/autoload/dup4func.vim', 'E707:')
1912
1913 lines =<< trim END
1914 vim9script
1915
1916 var Func = 'asdf'
1917
1918 export def Func()
1919 enddef
1920 END
1921 writefile(lines, 'Xdir/autoload/dup5func.vim')
1922 assert_fails('source Xdir/autoload/dup5func.vim', 'E707:')
1923
1924 lines =<< trim END
1925 vim9script
1926
1927 export def Func()
1928 enddef
1929
1930 var Func = 'asdf'
1931 END
1932 writefile(lines, 'Xdir/autoload/dup6func.vim')
1933 assert_fails('source Xdir/autoload/dup6func.vim', 'E1041: Redefining script item Func')
1934
1935 delete('Xdir', 'rf')
1936enddef
1937
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00001938def Test_autoload_missing_function_name()
1939 mkdir('Xdir/autoload', 'p')
1940
1941 var lines =<< trim END
1942 vim9script
1943
1944 def loadme#()
1945 enddef
1946 END
1947 writefile(lines, 'Xdir/autoload/loadme.vim')
1948 assert_fails('source Xdir/autoload/loadme.vim', 'E129:')
1949
1950 delete('Xdir', 'rf')
1951enddef
1952
Bram Moolenaar19e69a62022-01-21 20:37:05 +00001953def Test_autoload_name_wring()
1954 var lines =<< trim END
1955 vim9script
1956 def Xscriptname#Func()
1957 enddef
1958 END
1959 writefile(lines, 'Xscriptname.vim')
1960 CheckScriptFailure(lines, 'E1263:')
1961
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00001962 delete('Xscriptname.vim')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00001963enddef
1964
Bram Moolenaard041f422022-01-12 19:54:00 +00001965def Test_import_autoload_postponed()
1966 mkdir('Xdir/autoload', 'p')
1967 var save_rtp = &rtp
1968 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1969
1970 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00001971 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00001972
1973 g:loaded_postponed = 'true'
1974 export var variable = 'bla'
1975 export def Function(): string
1976 return 'bla'
1977 enddef
1978 END
1979 writefile(lines, 'Xdir/autoload/postponed.vim')
1980
1981 lines =<< trim END
1982 vim9script
1983
1984 import autoload 'postponed.vim'
1985 def Tryit()
1986 echo postponed.variable
1987 echo postponed.Function()
1988 enddef
1989 defcompile
1990 END
1991 CheckScriptSuccess(lines)
1992 assert_false(exists('g:loaded_postponed'))
1993 CheckScriptSuccess(lines + ['Tryit()'])
1994 assert_equal('true', g:loaded_postponed)
1995
1996 unlet g:loaded_postponed
1997 delete('Xdir', 'rf')
1998 &rtp = save_rtp
1999enddef
2000
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002001def Test_import_autoload_override()
2002 mkdir('Xdir/autoload', 'p')
2003 var save_rtp = &rtp
2004 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2005 test_override('autoload', 1)
2006
2007 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002008 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002009
2010 g:loaded_override = 'true'
2011 export var variable = 'bla'
2012 export def Function(): string
2013 return 'bla'
2014 enddef
2015 END
2016 writefile(lines, 'Xdir/autoload/override.vim')
2017
2018 lines =<< trim END
2019 vim9script
2020
2021 import autoload 'override.vim'
2022 assert_equal('true', g:loaded_override)
2023
2024 def Tryit()
2025 echo override.doesNotExist
2026 enddef
2027 defcompile
2028 END
2029 CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
2030
2031 test_override('autoload', 0)
2032 unlet g:loaded_override
2033 delete('Xdir', 'rf')
2034 &rtp = save_rtp
2035enddef
2036
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002037def Test_autoload_mapping()
2038 mkdir('Xdir/autoload', 'p')
2039 var save_rtp = &rtp
2040 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2041
2042 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002043 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002044
2045 g:toggle_loaded = 'yes'
2046
2047 export def Toggle(): string
2048 return ":g:toggle_called = 'yes'\<CR>"
2049 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002050 export def Doit()
2051 g:doit_called = 'yes'
2052 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002053 END
2054 writefile(lines, 'Xdir/autoload/toggle.vim')
2055
2056 lines =<< trim END
2057 vim9script
2058
2059 import autoload 'toggle.vim'
2060
2061 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002062 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2063 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002064 END
2065 CheckScriptSuccess(lines)
2066 assert_false(exists("g:toggle_loaded"))
2067 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002068 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002069
2070 feedkeys("tt", 'xt')
2071 assert_equal('yes', g:toggle_loaded)
2072 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002073 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002074
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002075 feedkeys("xx", 'xt')
2076 assert_equal('yes', g:doit_called)
2077
2078 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2079
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002080 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002081 nunmap xx
2082 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002083 unlet g:toggle_loaded
2084 unlet g:toggle_called
2085 delete('Xdir', 'rf')
2086 &rtp = save_rtp
2087enddef
2088
Bram Moolenaar160aa862022-01-10 21:29:57 +00002089def Test_vim9script_autoload_fails()
2090 var lines =<< trim END
2091 vim9script autoload
2092 var n = 0
2093 END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002094 CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
2095
2096 lines =<< trim END
2097 vim9script noclear noclear
2098 var n = 0
2099 END
2100 CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002101enddef
2102
2103def Test_import_autoload_fails()
2104 var lines =<< trim END
2105 vim9script
2106 import autoload autoload 'prefixed.vim'
2107 END
2108 CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
2109
2110 lines =<< trim END
2111 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002112 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002113 END
2114 CheckScriptFailure(lines, 'E1264:')
Bram Moolenaar1836d612022-01-18 13:14:47 +00002115
2116 lines =<< trim END
2117 vim9script
2118 import autoload '/dir/doesNotExist.vim'
2119 END
2120 CheckScriptFailure(lines, 'E1264:')
2121
2122 lines =<< trim END
2123 vim9script
2124 import autoload 'doesNotExist.vim'
2125 END
2126 CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002127enddef
2128
2129" test disassembling an auto-loaded function starting with "debug"
2130def Test_vim9_autoload_disass()
2131 mkdir('Xdir/autoload', 'p')
2132 var save_rtp = &rtp
2133 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2134
2135 var lines =<< trim END
2136 vim9script
2137 def debugit#test(): string
2138 return 'debug'
2139 enddef
2140 END
2141 writefile(lines, 'Xdir/autoload/debugit.vim')
2142
2143 lines =<< trim END
2144 vim9script
2145 def profileit#test(): string
2146 return 'profile'
2147 enddef
2148 END
2149 writefile(lines, 'Xdir/autoload/profileit.vim')
2150
2151 lines =<< trim END
2152 vim9script
2153 assert_equal('debug', debugit#test())
2154 disass debugit#test
2155 assert_equal('profile', profileit#test())
2156 disass profileit#test
2157 END
2158 CheckScriptSuccess(lines)
2159
2160 delete('Xdir', 'rf')
2161 &rtp = save_rtp
2162enddef
2163
2164" test using a vim9script that is auto-loaded from an autocmd
2165def Test_vim9_aucmd_autoload()
2166 var lines =<< trim END
2167 vim9script
2168 def foo#test()
2169 echomsg getreg('"')
2170 enddef
2171 END
2172
2173 mkdir('Xdir/autoload', 'p')
2174 writefile(lines, 'Xdir/autoload/foo.vim')
2175 var save_rtp = &rtp
2176 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2177 augroup test
2178 autocmd TextYankPost * call foo#test()
2179 augroup END
2180
2181 normal Y
2182
2183 augroup test
2184 autocmd!
2185 augroup END
2186 delete('Xdir', 'rf')
2187 &rtp = save_rtp
2188enddef
2189
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002190" test using a autoloaded file that is case sensitive
2191def Test_vim9_autoload_case_sensitive()
2192 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002193 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002194 export def CaseSensitive(): string
2195 return 'done'
2196 enddef
2197 END
2198
2199 mkdir('Xdir/autoload', 'p')
2200 writefile(lines, 'Xdir/autoload/CaseSensitive.vim')
2201 var save_rtp = &rtp
2202 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2203
2204 lines =<< trim END
2205 vim9script
2206 import autoload 'CaseSensitive.vim'
2207 assert_equal('done', CaseSensitive.CaseSensitive())
2208 END
2209 CheckScriptSuccess(lines)
2210
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002211 if !has('fname_case')
2212 lines =<< trim END
2213 vim9script
2214 import autoload 'CaseSensitive.vim'
2215 import autoload 'casesensitive.vim'
2216 END
2217 CheckScriptFailure(lines, 'E1262:')
2218 endif
2219
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002220 delete('Xdir', 'rf')
2221 &rtp = save_rtp
2222enddef
2223
Bram Moolenaar160aa862022-01-10 21:29:57 +00002224" This was causing a crash because suppress_errthrow wasn't reset.
2225def Test_vim9_autoload_error()
2226 var lines =<< trim END
2227 vim9script
2228 def crash#func()
2229 try
2230 for x in List()
2231 endfor
2232 catch
2233 endtry
2234 g:ok = true
2235 enddef
2236 fu List()
2237 invalid
2238 endfu
2239 try
2240 alsoinvalid
2241 catch /wontmatch/
2242 endtry
2243 END
2244 call mkdir('Xruntime/autoload', 'p')
2245 call writefile(lines, 'Xruntime/autoload/crash.vim')
2246
2247 # run in a separate Vim to avoid the side effects of assert_fails()
2248 lines =<< trim END
2249 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
2250 call crash#func()
2251 call writefile(['ok'], 'Xdidit')
2252 qall!
2253 END
2254 writefile(lines, 'Xscript')
2255 RunVim([], [], '-S Xscript')
2256 assert_equal(['ok'], readfile('Xdidit'))
2257
2258 delete('Xdidit')
2259 delete('Xscript')
2260 delete('Xruntime', 'rf')
2261
2262 lines =<< trim END
2263 vim9script
2264 var foo#bar = 'asdf'
2265 END
2266 CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
2267enddef
2268
Bram Moolenaard8448622022-01-07 21:39:52 +00002269
2270" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker