blob: 13530151a2a7e3568f0f361882123769aff73ece [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
70 g:imported_name = expo.exp_name
71 expo.exp_name ..= ' Doe'
Bram Moolenaar47036b62022-01-16 21:18:53 +000072 expo.exp_name = expo.exp_name .. ' Maar'
Bram Moolenaard8448622022-01-07 21:39:52 +000073 g:imported_name_appended = expo.exp_name
74 g:exported_later = expo.exported
75
76 expo.theList->add(2)
77 assert_equal([1, 2], expo.theList)
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000078
79 assert_equal('andthensome', 'andthen'->expo.AddSome())
80 assert_equal('awesome', 'awe'->expo.AddRef())
Bram Moolenaard8448622022-01-07 21:39:52 +000081 END
82 writefile(import_script_lines, 'Ximport.vim')
83 source Ximport.vim
84
85 assert_equal('bobbie', g:result)
86 assert_equal('bob', g:localname)
87 assert_equal(9876, g:exported1)
88 assert_equal(9879, g:exported2)
89 assert_equal(9879, g:exported3)
90
91 assert_equal(9884, g:exported_i1)
92 assert_equal(9884, g:exported_i2)
93
94 assert_equal(11, g:exported_s1)
95 assert_equal(11, g:exported_s2)
96 assert_equal(11, g:exported_later)
97
98 assert_equal('Exported', g:imported_func)
99 assert_equal('Exported', g:funcref_result)
100 assert_equal('John', g:imported_name)
Bram Moolenaar47036b62022-01-16 21:18:53 +0000101 assert_equal('John Doe Maar', g:imported_name_appended)
Bram Moolenaard8448622022-01-07 21:39:52 +0000102 assert_false(exists('g:name'))
103
104 Undo_export_script_lines()
105 unlet g:exported1
106 unlet g:exported2
107 unlet g:exported3
108 unlet g:exported_i1
109 unlet g:exported_i2
110 unlet g:exported_later
111 unlet g:imported_func
112 unlet g:imported_name g:imported_name_appended
113 delete('Ximport.vim')
114
115 # similar, with line breaks
116 var import_line_break_script_lines =<< trim END
117 vim9script
118 import './Xexport.vim'
119 as expo
120 g:exported = expo.exported
121 expo.exported += 7
122 g:exported_added = expo.exported
123 g:imported_func = expo.Exported()
124 END
125 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
126 source Ximport_lbr.vim
127
128 assert_equal(11, g:exported)
129 assert_equal(18, g:exported_added)
130 assert_equal('Exported', g:imported_func)
131
132 # exported script not sourced again
133 assert_false(exists('g:result'))
134 unlet g:exported
135 unlet g:exported_added
136 unlet g:imported_func
137 delete('Ximport_lbr.vim')
138
139 var line_break_before_dot =<< trim END
140 vim9script
141 import './Xexport.vim' as expo
142 g:exported = expo
143 .exported
144 END
145 writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
146 assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
147 delete('Ximport_lbr_before_dot.vim')
148
149 var line_break_after_dot =<< trim END
150 vim9script
151 import './Xexport.vim' as expo
152 g:exported = expo.
153 exported
154 END
155 writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
156 assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
157 delete('Ximport_lbr_after_dot.vim')
158
159 var import_star_as_lines =<< trim END
160 vim9script
161 import './Xexport.vim' as Export
162 def UseExport()
163 g:exported_def = Export.exported
164 enddef
165 g:exported_script = Export.exported
166 assert_equal(1, exists('Export.exported'))
167 assert_equal(0, exists('Export.notexported'))
168 UseExport()
169 END
170 writefile(import_star_as_lines, 'Ximport.vim')
171 source Ximport.vim
172
173 assert_equal(18, g:exported_def)
174 assert_equal(18, g:exported_script)
175 unlet g:exported_def
176 unlet g:exported_script
177
178 var import_star_as_lines_no_dot =<< trim END
179 vim9script
180 import './Xexport.vim' as Export
181 def Func()
182 var dummy = 1
183 var imported = Export + dummy
184 enddef
185 defcompile
186 END
187 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
188 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
189
190 var import_star_as_lines_dot_space =<< trim END
191 vim9script
192 import './Xexport.vim' as Export
193 def Func()
194 var imported = Export . exported
195 enddef
196 defcompile
197 END
198 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
199 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
200
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000201 writefile(s:export_script_lines, 'Xexport2.vim')
202 var import_as_duplicated =<< trim END
Bram Moolenaard8448622022-01-07 21:39:52 +0000203 vim9script
204 import './Xexport.vim' as expo
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000205 import './Xexport2.vim' as expo
Bram Moolenaard8448622022-01-07 21:39:52 +0000206 END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000207 writefile(import_as_duplicated, 'Ximport.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000208 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000209 delete('Xexport2.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000210
211 var import_star_as_lines_script_no_dot =<< trim END
212 vim9script
213 import './Xexport.vim' as Export
214 g:imported_script = Export exported
215 END
216 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
217 assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
218
219 var import_star_as_lines_script_space_after_dot =<< trim END
220 vim9script
221 import './Xexport.vim' as Export
222 g:imported_script = Export. exported
223 END
224 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
225 assert_fails('source Ximport.vim', 'E1074:')
226
227 var import_star_as_lines_missing_name =<< trim END
228 vim9script
229 import './Xexport.vim' as Export
230 def Func()
231 var imported = Export.
232 enddef
233 defcompile
234 END
235 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
236 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
237
238 var import_star_as_lbr_lines =<< trim END
239 vim9script
240 import './Xexport.vim'
241 as Export
242 def UseExport()
243 g:exported = Export.exported
244 enddef
245 UseExport()
246 END
247 writefile(import_star_as_lbr_lines, 'Ximport.vim')
248 source Ximport.vim
249 assert_equal(18, g:exported)
250 unlet g:exported
251
252 # try to use something that exists but is not exported
253 var import_not_exported_lines =<< trim END
254 vim9script
255 import './Xexport.vim' as expo
256 echo expo.name
257 END
258 writefile(import_not_exported_lines, 'Ximport.vim')
259 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
260
261 # try to import something that is already defined
262 var import_already_defined =<< trim END
263 vim9script
264 var exported = 'something'
265 import './Xexport.vim' as exported
266 END
267 writefile(import_already_defined, 'Ximport.vim')
268 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
269
270 # try changing an imported const
271 var import_assign_to_const =<< trim END
272 vim9script
273 import './Xexport.vim' as expo
274 def Assign()
275 expo.CONST = 987
276 enddef
277 defcompile
278 END
279 writefile(import_assign_to_const, 'Ximport.vim')
280 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
281
282 # try changing an imported final
283 var import_assign_to_final =<< trim END
284 vim9script
285 import './Xexport.vim' as expo
286 def Assign()
287 expo.theList = [2]
288 enddef
289 defcompile
290 END
291 writefile(import_assign_to_final, 'Ximport.vim')
292 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
293
294 var import_no_as_lines =<< trim END
295 vim9script
296 import './Xexport.vim' name
297 END
298 writefile(import_no_as_lines, 'Ximport.vim')
299 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
300
301 var import_invalid_string_lines =<< trim END
302 vim9script
303 import Xexport.vim
304 END
305 writefile(import_invalid_string_lines, 'Ximport.vim')
306 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
307
308 var import_wrong_name_lines =<< trim END
309 vim9script
310 import './XnoExport.vim'
311 END
312 writefile(import_wrong_name_lines, 'Ximport.vim')
313 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
314
315 var import_redefining_lines =<< trim END
316 vim9script
317 import './Xexport.vim' as exported
318 var exported = 5
319 END
320 writefile(import_redefining_lines, 'Ximport.vim')
321 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
322
Bram Moolenaar160aa862022-01-10 21:29:57 +0000323 var import_missing_dot_lines =<< trim END
324 vim9script
325 import './Xexport.vim' as expo
326 def Test()
327 expo = 9
328 enddef
329 defcompile
330 END
331 writefile(import_missing_dot_lines, 'Ximport.vim')
332 assert_fails('source Ximport.vim', 'E1258:', '', 1)
333
334 var import_missing_name_lines =<< trim END
335 vim9script
336 import './Xexport.vim' as expo
337 def Test()
338 expo.99 = 9
339 enddef
340 defcompile
341 END
342 writefile(import_missing_name_lines, 'Ximport.vim')
Bram Moolenaar76283822022-01-10 21:39:03 +0000343 assert_fails('source Ximport.vim', 'E1259:', '', 1)
Bram Moolenaar160aa862022-01-10 21:29:57 +0000344
Bram Moolenaard8448622022-01-07 21:39:52 +0000345 var import_assign_wrong_type_lines =<< trim END
346 vim9script
347 import './Xexport.vim' as expo
348 expo.exported = 'xxx'
349 END
350 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
351 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
352
353 var import_assign_const_lines =<< trim END
354 vim9script
355 import './Xexport.vim' as expo
356 expo.CONST = 4321
357 END
358 writefile(import_assign_const_lines, 'Ximport.vim')
359 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
360
361 delete('Ximport.vim')
362 delete('Ximport3.vim')
363 delete('Xexport.vim')
364
365 # Check that in a Vim9 script 'cpo' is set to the Vim default.
366 # Flags added or removed are also applied to the restored value.
367 set cpo=abcd
368 var lines =<< trim END
369 vim9script
370 g:cpo_in_vim9script = &cpo
371 set cpo+=f
372 set cpo-=c
373 g:cpo_after_vim9script = &cpo
374 END
375 writefile(lines, 'Xvim9_script')
376 source Xvim9_script
377 assert_equal('fabd', &cpo)
378 set cpo&vim
379 assert_equal(&cpo, g:cpo_in_vim9script)
380 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
381 assert_equal(newcpo, g:cpo_after_vim9script)
382
383 delete('Xvim9_script')
384enddef
385
386def Test_import_funcref()
387 var lines =<< trim END
388 vim9script
389 export def F(): number
390 return 42
391 enddef
392 export const G = F
393 END
394 writefile(lines, 'Xlib.vim')
395
396 lines =<< trim END
397 vim9script
398 import './Xlib.vim' as lib
399 const Foo = lib.G()
400 assert_equal(42, Foo)
401
402 def DoTest()
403 const Goo = lib.G()
404 assert_equal(42, Goo)
405 enddef
406 DoTest()
407 END
408 CheckScriptSuccess(lines)
409
410 delete('Xlib.vim')
411enddef
412
413def Test_import_fails()
414 writefile([], 'Xfoo.vim')
415 var lines =<< trim END
416 import './Xfoo.vim' as foo
417 foo = 'bar'
418 END
419 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
420 lines =<< trim END
421 vim9script
422 import './Xfoo.vim' as foo
423 var that = foo
424 END
425 CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
426
427 lines =<< trim END
428 vim9script
429 import './Xfoo.vim' as 9foo
430 END
431 CheckScriptFailure(lines, 'E1047:')
432 lines =<< trim END
433 vim9script
434 import './Xfoo.vim' as the#foo
435 END
436 CheckScriptFailure(lines, 'E1047:')
437 lines =<< trim END
438 vim9script
439 import './Xfoo.vim' as g:foo
440 END
441 CheckScriptFailure(lines, 'E1047:')
442
443 delete('Xfoo.vim')
444
445 lines =<< trim END
446 vim9script
447 def TheFunc()
448 echo 'the func'
449 enddef
450 export var Ref = TheFunc
451 END
452 writefile([], 'Xthat.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000453
Bram Moolenaard8448622022-01-07 21:39:52 +0000454 lines =<< trim END
455 import './Xthat.vim' as That
456 That()
457 END
458 CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000459
460 lines =<< trim END
461 import './Xthat.vim' as one
462 import './Xthat.vim' as two
463 END
464 CheckScriptFailure(lines, 'E1262:')
465
466 delete('Xthat.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000467
468 mkdir('Ximport')
469
470 writefile(['vim9script'], 'Ximport/.vim')
471 lines =<< trim END
472 vim9script
473 import './Ximport/.vim'
474 END
475 CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
476 lines =<< trim END
477 vim9script
478 import './Ximport/.vim' as vim
479 END
480 CheckScriptSuccess(lines)
481
482 writefile(['vim9script'], 'Ximport/.vimrc')
483 lines =<< trim END
484 vim9script
485 import './Ximport/.vimrc'
486 END
487 CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
488 lines =<< trim END
489 vim9script
490 import './Ximport/.vimrc' as vimrc
491 END
492 CheckScriptSuccess(lines)
493
494 delete('Ximport', 'rf')
495enddef
496
497func g:Trigger()
498 source Ximport.vim
499 return "echo 'yes'\<CR>"
500endfunc
501
502def Test_import_export_expr_map()
503 # check that :import and :export work when buffer is locked
504 var export_lines =<< trim END
505 vim9script
506 export def That(): string
507 return 'yes'
508 enddef
509 END
510 writefile(export_lines, 'Xexport_that.vim')
511
512 var import_lines =<< trim END
513 vim9script
514 import './Xexport_that.vim' as that
515 assert_equal('yes', that.That())
516 END
517 writefile(import_lines, 'Ximport.vim')
518
519 nnoremap <expr> trigger g:Trigger()
520 feedkeys('trigger', "xt")
521
522 delete('Xexport_that.vim')
523 delete('Ximport.vim')
524 nunmap trigger
525enddef
526
527def Test_import_in_filetype()
528 # check that :import works when the buffer is locked
529 mkdir('ftplugin', 'p')
530 var export_lines =<< trim END
531 vim9script
532 export var That = 'yes'
533 END
534 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
535
536 var import_lines =<< trim END
537 vim9script
538 import './Xexport_ft.vim' as ft
539 assert_equal('yes', ft.That)
540 g:did_load_mytpe = 1
541 END
542 writefile(import_lines, 'ftplugin/qf.vim')
543
544 var save_rtp = &rtp
545 &rtp = getcwd() .. ',' .. &rtp
546
547 filetype plugin on
548 copen
549 assert_equal(1, g:did_load_mytpe)
550
551 quit!
552 delete('Xexport_ft.vim')
553 delete('ftplugin', 'rf')
554 &rtp = save_rtp
555enddef
556
557def Test_use_import_in_mapping()
558 var lines =<< trim END
559 vim9script
560 export def Funcx()
561 g:result = 42
562 enddef
563 END
564 writefile(lines, 'XsomeExport.vim')
565 lines =<< trim END
566 vim9script
567 import './XsomeExport.vim' as some
568 var Funcy = some.Funcx
569 nnoremap <F3> :call <sid>Funcy()<cr>
570 END
571 writefile(lines, 'Xmapscript.vim')
572
573 source Xmapscript.vim
574 feedkeys("\<F3>", "xt")
575 assert_equal(42, g:result)
576
577 unlet g:result
578 delete('XsomeExport.vim')
579 delete('Xmapscript.vim')
580 nunmap <F3>
581enddef
582
Bram Moolenaar15d16352022-01-17 20:09:08 +0000583def Test_use_import_in_completion()
584 var lines =<< trim END
585 vim9script
586 export def Complete(..._): list<string>
587 return ['abcd']
588 enddef
589 END
590 writefile(lines, 'Xscript.vim')
591
592 lines =<< trim END
593 vim9script
594 import './Xscript.vim'
595
596 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
597 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
598 assert_equal('#Cmd abcd', @:)
599 END
600 CheckScriptSuccess(lines)
601
602 delcommand Cmd
603 delete('Xscript.vim')
604enddef
605
Bram Moolenaard8448622022-01-07 21:39:52 +0000606def Test_export_fails()
607 CheckScriptFailure(['export var some = 123'], 'E1042:')
608 CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
609 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
610
611 assert_fails('export something', 'E1043:')
612enddef
613
614func Test_import_fails_without_script()
615 CheckRunVimInTerminal
616
617 " call indirectly to avoid compilation error for missing functions
618 call Run_Test_import_fails_on_command_line()
619endfunc
620
621def Run_Test_import_fails_on_command_line()
622 var export =<< trim END
623 vim9script
624 export def Foo(): number
625 return 0
626 enddef
627 END
628 writefile(export, 'XexportCmd.vim')
629
630 var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
631 rows: 6, wait_for_ruler: 0})
632 WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
633
634 delete('XexportCmd.vim')
635 StopVimInTerminal(buf)
636enddef
637
638def Test_vim9_reload_noclear()
639 var lines =<< trim END
640 vim9script
641 export var exported = 'thexport'
642
643 export def TheFunc(x = 0)
644 enddef
645 END
646 writefile(lines, 'XExportReload')
647 lines =<< trim END
648 vim9script noclear
649 g:loadCount += 1
650 var s:reloaded = 'init'
651 import './XExportReload' as exp
652
653 def Again(): string
654 return 'again'
655 enddef
656
657 exp.TheFunc()
658
659 if exists('s:loaded') | finish | endif
660 var s:loaded = true
661
662 var s:notReloaded = 'yes'
663 s:reloaded = 'first'
664 def g:Values(): list<string>
665 return [s:reloaded, s:notReloaded, Again(), Once(), exp.exported]
666 enddef
667
668 def Once(): string
669 return 'once'
670 enddef
671 END
672 writefile(lines, 'XReloaded')
673 g:loadCount = 0
674 source XReloaded
675 assert_equal(1, g:loadCount)
676 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
677 source XReloaded
678 assert_equal(2, g:loadCount)
679 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
680 source XReloaded
681 assert_equal(3, g:loadCount)
682 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
683
684 delete('XReloaded')
685 delete('XExportReload')
686 delfunc g:Values
687 unlet g:loadCount
688
689 lines =<< trim END
690 vim9script
691 def Inner()
692 enddef
693 END
694 lines->writefile('XreloadScript.vim')
695 source XreloadScript.vim
696
697 lines =<< trim END
698 vim9script
699 def Outer()
700 def Inner()
701 enddef
702 enddef
703 defcompile
704 END
705 lines->writefile('XreloadScript.vim')
706 source XreloadScript.vim
707
708 delete('XreloadScript.vim')
709enddef
710
711def Test_vim9_reload_import()
712 var lines =<< trim END
713 vim9script
714 const var = ''
715 var valone = 1234
716 def MyFunc(arg: string)
717 valone = 5678
718 enddef
719 END
720 var morelines =<< trim END
721 var valtwo = 222
722 export def GetValtwo(): number
723 return valtwo
724 enddef
725 END
726 writefile(lines + morelines, 'Xreload.vim')
727 source Xreload.vim
728 source Xreload.vim
729 source Xreload.vim
730
731 # cannot declare a var twice
732 lines =<< trim END
733 vim9script
734 var valone = 1234
735 var valone = 5678
736 END
737 writefile(lines, 'Xreload.vim')
738 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
739
740 delete('Xreload.vim')
741 delete('Ximport.vim')
742enddef
743
744" if a script is reloaded with a script-local variable that changed its type, a
745" compiled function using that variable must fail.
746def Test_script_reload_change_type()
747 var lines =<< trim END
748 vim9script noclear
749 var str = 'string'
750 def g:GetStr(): string
751 return str .. 'xxx'
752 enddef
753 END
754 writefile(lines, 'Xreload.vim')
755 source Xreload.vim
756 echo g:GetStr()
757
758 lines =<< trim END
759 vim9script noclear
760 var str = 1234
761 END
762 writefile(lines, 'Xreload.vim')
763 source Xreload.vim
764 assert_fails('echo g:GetStr()', 'E1150:')
765
766 delfunc g:GetStr
767 delete('Xreload.vim')
768enddef
769
770" Define CallFunc so that the test can be compiled
771command CallFunc echo 'nop'
772
773def Test_script_reload_from_function()
774 var lines =<< trim END
775 vim9script
776
777 if exists('g:loaded')
778 finish
779 endif
780 g:loaded = 1
781 delcommand CallFunc
782 command CallFunc Func()
783 def Func()
784 so XreloadFunc.vim
785 g:didTheFunc = 1
786 enddef
787 END
788 writefile(lines, 'XreloadFunc.vim')
789 source XreloadFunc.vim
790 CallFunc
791 assert_equal(1, g:didTheFunc)
792
793 delete('XreloadFunc.vim')
794 delcommand CallFunc
795 unlet g:loaded
796 unlet g:didTheFunc
797enddef
798
799def s:RetSome(): string
800 return 'some'
801enddef
802
803" Not exported function that is referenced needs to be accessed by the
804" script-local name.
805def Test_vim9_funcref()
806 var sortlines =<< trim END
807 vim9script
808 def Compare(i1: number, i2: number): number
809 return i2 - i1
810 enddef
811
812 export def FastSort(): list<number>
813 return range(5)->sort(Compare)
814 enddef
815
816 export def GetString(arg: string): string
817 return arg
818 enddef
819 END
820 writefile(sortlines, 'Xsort.vim')
821
822 var lines =<< trim END
823 vim9script
824 import './Xsort.vim'
825 def Test()
826 g:result = Xsort.FastSort()
827 enddef
828 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000829 END
830 writefile(lines, 'Xscript.vim')
831 source Xscript.vim
832 assert_equal([4, 3, 2, 1, 0], g:result)
833 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +0000834
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000835 lines =<< trim END
836 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +0000837 # using a function imported with "as"
838 import './Xsort.vim' as anAlias
839 assert_equal('yes', anAlias.GetString('yes'))
840
841 # using the function from a compiled function
842 def TestMore(): string
843 var s = s:anAlias.GetString('foo')
844 return s .. anAlias.GetString('bar')
845 enddef
846 assert_equal('foobar', TestMore())
847
848 # error when using a function that isn't exported
849 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
850 END
851 writefile(lines, 'Xscript.vim')
852
Bram Moolenaard8448622022-01-07 21:39:52 +0000853 delete('Xsort.vim')
854 delete('Xscript.vim')
855
856 var Funcref = function('s:RetSome')
857 assert_equal('some', Funcref())
858enddef
859
860" Check that when searching for "FilterFunc" it finds the import in the
861" script where FastFilter() is called from, both as a string and as a direct
862" function reference.
863def Test_vim9_funcref_other_script()
864 var filterLines =<< trim END
865 vim9script
866 export def FilterFunc(idx: number, val: number): bool
867 return idx % 2 == 1
868 enddef
869 export def FastFilter(): list<number>
870 return range(10)->filter('FilterFunc(v:key, v:val)')
871 enddef
872 export def FastFilterDirect(): list<number>
873 return range(10)->filter(FilterFunc)
874 enddef
875 END
876 writefile(filterLines, 'Xfilter.vim')
877
878 var lines =<< trim END
879 vim9script
880 import './Xfilter.vim' as filter
881 def Test()
882 var x: list<number> = filter.FastFilter()
883 enddef
884 Test()
885 def TestDirect()
886 var x: list<number> = filter.FastFilterDirect()
887 enddef
888 TestDirect()
889 END
890 CheckScriptSuccess(lines)
891 delete('Xfilter.vim')
892enddef
893
894def Test_import_absolute()
895 var import_lines = [
896 'vim9script',
897 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
898 'def UseExported()',
899 ' g:imported_abs = abs.exported',
900 ' abs.exported = 8888',
901 ' g:imported_after = abs.exported',
902 'enddef',
903 'UseExported()',
904 'g:import_disassembled = execute("disass UseExported")',
905 ]
906 writefile(import_lines, 'Ximport_abs.vim')
907 writefile(s:export_script_lines, 'Xexport_abs.vim')
908
909 source Ximport_abs.vim
910
911 assert_equal(9876, g:imported_abs)
912 assert_equal(8888, g:imported_after)
913 assert_match('<SNR>\d\+_UseExported\_s*' ..
914 'g:imported_abs = abs.exported\_s*' ..
915 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
916 '1 STOREG g:imported_abs\_s*' ..
917 'abs.exported = 8888\_s*' ..
918 '2 PUSHNR 8888\_s*' ..
919 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
920 'g:imported_after = abs.exported\_s*' ..
921 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
922 '5 STOREG g:imported_after',
923 g:import_disassembled)
924
925 Undo_export_script_lines()
926 unlet g:imported_abs
927 unlet g:import_disassembled
928
929 delete('Ximport_abs.vim')
930 delete('Xexport_abs.vim')
931enddef
932
933def Test_import_rtp()
934 var import_lines = [
935 'vim9script',
936 'import "Xexport_rtp.vim" as rtp',
937 'g:imported_rtp = rtp.exported',
938 ]
939 writefile(import_lines, 'Ximport_rtp.vim')
940 mkdir('import', 'p')
941 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
942
943 var save_rtp = &rtp
944 &rtp = getcwd()
945 source Ximport_rtp.vim
946 &rtp = save_rtp
947
948 assert_equal(9876, g:imported_rtp)
949
950 Undo_export_script_lines()
951 unlet g:imported_rtp
952 delete('Ximport_rtp.vim')
953 delete('import', 'rf')
954enddef
955
956def Test_import_compile_error()
957 var export_lines = [
958 'vim9script',
959 'export def ExpFunc(): string',
960 ' return notDefined',
961 'enddef',
962 ]
963 writefile(export_lines, 'Xexported.vim')
964
965 var import_lines = [
966 'vim9script',
967 'import "./Xexported.vim" as expo',
968 'def ImpFunc()',
969 ' echo expo.ExpFunc()',
970 'enddef',
971 'defcompile',
972 ]
973 writefile(import_lines, 'Ximport.vim')
974
975 try
976 source Ximport.vim
977 catch /E1001/
978 # Error should be before the Xexported.vim file.
979 assert_match('E1001: Variable not found: notDefined', v:exception)
980 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
981 endtry
982
983 delete('Xexported.vim')
984 delete('Ximport.vim')
985enddef
986
987def Test_func_overrules_import_fails()
988 var export_lines =<< trim END
989 vim9script
990 export def Func()
991 echo 'imported'
992 enddef
993 END
994 writefile(export_lines, 'XexportedFunc.vim')
995
996 var lines =<< trim END
997 vim9script
998 import './XexportedFunc.vim' as Func
999 def Func()
1000 echo 'local to function'
1001 enddef
1002 END
1003 CheckScriptFailure(lines, 'E1236:')
1004
1005 lines =<< trim END
1006 vim9script
1007 import './XexportedFunc.vim' as Func
1008 def Outer()
1009 def Func()
1010 echo 'local to function'
1011 enddef
1012 enddef
1013 defcompile
1014 END
1015 CheckScriptFailure(lines, 'E1236:')
1016
1017 delete('XexportedFunc.vim')
1018enddef
1019
1020def Test_source_vim9_from_legacy()
1021 var vim9_lines =<< trim END
1022 vim9script
1023 var local = 'local'
1024 g:global = 'global'
1025 export var exported = 'exported'
1026 export def GetText(): string
1027 return 'text'
1028 enddef
1029 END
1030 writefile(vim9_lines, 'Xvim9_script.vim')
1031
1032 var legacy_lines =<< trim END
1033 source Xvim9_script.vim
1034
1035 call assert_false(exists('local'))
1036 call assert_false(exists('exported'))
1037 call assert_false(exists('s:exported'))
1038 call assert_equal('global', global)
1039 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00001040 END
1041 writefile(legacy_lines, 'Xlegacy_script.vim')
1042
1043 source Xlegacy_script.vim
1044 assert_equal('global', g:global)
1045 unlet g:global
1046
1047 delete('Xlegacy_script.vim')
1048 delete('Xvim9_script.vim')
1049enddef
1050
Bram Moolenaarc43e6232022-01-13 20:51:56 +00001051def Test_import_vim9_from_legacy()
1052 var vim9_lines =<< trim END
1053 vim9script
1054 var local = 'local'
1055 g:global = 'global'
1056 export var exported = 'exported'
1057 export def GetText(): string
1058 return 'text'
1059 enddef
1060 END
1061 writefile(vim9_lines, 'Xvim9_export.vim')
1062
1063 var legacy_lines =<< trim END
1064 import './Xvim9_export.vim' as vim9
1065
1066 call assert_false(exists('vim9'))
1067 call assert_false(exists('local'))
1068 call assert_false(exists('s:vim9.local'))
1069 call assert_equal('global', global)
1070 call assert_equal('global', g:global)
1071 call assert_false(exists('exported'))
1072 call assert_false(exists('s:exported'))
1073 call assert_false(exists('*GetText'))
1074
1075 " imported symbol is script-local
1076 call assert_equal('exported', s:vim9.exported)
1077 call assert_equal('text', s:vim9.GetText())
1078 END
1079 writefile(legacy_lines, 'Xlegacy_script.vim')
1080
1081 source Xlegacy_script.vim
1082 assert_equal('global', g:global)
1083 unlet g:global
1084
1085 delete('Xlegacy_script.vim')
1086 delete('Xvim9_export.vim')
1087enddef
1088
Bram Moolenaard8448622022-01-07 21:39:52 +00001089def Test_cmdline_win()
1090 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
1091 # the command line window.
1092 mkdir('rtp/syntax', 'p')
1093 var export_lines =<< trim END
1094 vim9script
1095 export var That = 'yes'
1096 END
1097 writefile(export_lines, 'rtp/syntax/Xexport.vim')
1098 var import_lines =<< trim END
1099 vim9script
1100 import './Xexport.vim' as exp
1101 echo exp.That
1102 END
1103 writefile(import_lines, 'rtp/syntax/vim.vim')
1104 var save_rtp = &rtp
1105 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
1106 syntax on
1107 augroup CmdWin
1108 autocmd CmdwinEnter * g:got_there = 'yes'
1109 augroup END
1110 # this will open and also close the cmdline window
1111 feedkeys('q:', 'xt')
1112 assert_equal('yes', g:got_there)
1113
1114 augroup CmdWin
1115 au!
1116 augroup END
1117 &rtp = save_rtp
1118 delete('rtp', 'rf')
1119enddef
1120
1121def Test_import_gone_when_sourced_twice()
1122 var exportlines =<< trim END
1123 vim9script
1124 if exists('g:guard')
1125 finish
1126 endif
1127 g:guard = 1
1128 export var name = 'someName'
1129 END
1130 writefile(exportlines, 'XexportScript.vim')
1131
1132 var lines =<< trim END
1133 vim9script
1134 import './XexportScript.vim' as expo
1135 def g:GetName(): string
1136 return expo.name
1137 enddef
1138 END
1139 writefile(lines, 'XscriptImport.vim')
1140 so XscriptImport.vim
1141 assert_equal('someName', g:GetName())
1142
1143 so XexportScript.vim
1144 assert_fails('call g:GetName()', 'E1149:')
1145
1146 delfunc g:GetName
1147 delete('XexportScript.vim')
1148 delete('XscriptImport.vim')
1149 unlet g:guard
1150enddef
1151
Bram Moolenaar160aa862022-01-10 21:29:57 +00001152" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001153def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00001154 var lines =<< trim END
1155 vim9script
1156 def some#gettest(): string
1157 return 'test'
1158 enddef
1159 g:some#name = 'name'
1160 g:some#dict = {key: 'value'}
1161
1162 def some#varargs(a1: string, ...l: list<string>): string
1163 return a1 .. l[0] .. l[1]
1164 enddef
1165 END
1166
1167 mkdir('Xdir/autoload', 'p')
1168 writefile(lines, 'Xdir/autoload/some.vim')
1169 var save_rtp = &rtp
1170 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1171
1172 assert_equal('test', g:some#gettest())
1173 assert_equal('name', g:some#name)
1174 assert_equal('value', g:some#dict.key)
1175 g:some#other = 'other'
1176 assert_equal('other', g:some#other)
1177
1178 assert_equal('abc', some#varargs('a', 'b', 'c'))
1179
1180 # upper case script name works
1181 lines =<< trim END
1182 vim9script
1183 def Other#getOther(): string
1184 return 'other'
1185 enddef
1186 END
1187 writefile(lines, 'Xdir/autoload/Other.vim')
1188 assert_equal('other', g:Other#getOther())
1189
1190 delete('Xdir', 'rf')
1191 &rtp = save_rtp
1192enddef
1193
1194def Test_vim9script_autoload()
1195 mkdir('Xdir/autoload', 'p')
1196 var save_rtp = &rtp
1197 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1198
1199 # when using "vim9script autoload" prefix is not needed
1200 var lines =<< trim END
1201 vim9script autoload
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001202 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00001203
1204 export def Gettest(): string
1205 return 'test'
1206 enddef
1207
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001208 export var name = 'name'
1209
1210 export func GetFunc()
1211 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00001212 endfunc
1213
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001214 export def GetDef(): string
1215 return Gettest() .. 'more' .. name
1216 enddef
1217
Bram Moolenaar160aa862022-01-10 21:29:57 +00001218 export final fname = 'final'
1219 export const cname = 'const'
1220 END
1221 writefile(lines, 'Xdir/autoload/prefixed.vim')
1222
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001223 g:prefixed_loaded = 0
1224 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00001225 lines =<< trim END
1226 vim9script
1227 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001228 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001229 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001230 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001231
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001232 assert_equal('testmorename', prefixed.GetFunc())
1233 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00001234 assert_equal('name', prefixed.name)
1235 assert_equal('final', prefixed.fname)
1236 assert_equal('const', prefixed.cname)
1237 END
1238 CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001239 # can source it again, autoload script not loaded again
1240 g:expected_loaded = 1
1241 CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001242
1243 # can also get the items by autoload name
1244 lines =<< trim END
1245 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001246 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00001247 call assert_equal('name', prefixed#name)
1248 call assert_equal('final', prefixed#fname)
1249 call assert_equal('const', prefixed#cname)
1250 END
1251 CheckScriptSuccess(lines)
1252
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001253 unlet g:prefixed_loaded
1254 unlet g:expected_loaded
1255 delete('Xdir', 'rf')
1256 &rtp = save_rtp
1257enddef
1258
1259def Test_vim9script_autoload_call()
1260 mkdir('Xdir/autoload', 'p')
1261 var save_rtp = &rtp
1262 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1263
1264 var lines =<< trim END
1265 vim9script autoload
1266
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00001267 export def RetArg(arg: string): string
1268 return arg
1269 enddef
1270
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001271 export def Getother()
1272 g:result = 'other'
1273 enddef
1274 END
Bram Moolenaar5d982692022-01-12 15:15:27 +00001275 writefile(lines, 'Xdir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001276
1277 lines =<< trim END
1278 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00001279 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00001280
1281 # compile this before 'another.vim' is loaded
1282 def CallAnother()
1283 assert_equal('foo', 'foo'->another.RetArg())
1284 enddef
1285 CallAnother()
1286
Bram Moolenaar5d982692022-01-12 15:15:27 +00001287 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001288 assert_equal('other', g:result)
1289 END
1290 CheckScriptSuccess(lines)
1291
1292 unlet g:result
Bram Moolenaar160aa862022-01-10 21:29:57 +00001293 delete('Xdir', 'rf')
1294 &rtp = save_rtp
1295enddef
1296
Bram Moolenaard041f422022-01-12 19:54:00 +00001297def Test_import_autoload_postponed()
1298 mkdir('Xdir/autoload', 'p')
1299 var save_rtp = &rtp
1300 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1301
1302 var lines =<< trim END
1303 vim9script autoload
1304
1305 g:loaded_postponed = 'true'
1306 export var variable = 'bla'
1307 export def Function(): string
1308 return 'bla'
1309 enddef
1310 END
1311 writefile(lines, 'Xdir/autoload/postponed.vim')
1312
1313 lines =<< trim END
1314 vim9script
1315
1316 import autoload 'postponed.vim'
1317 def Tryit()
1318 echo postponed.variable
1319 echo postponed.Function()
1320 enddef
1321 defcompile
1322 END
1323 CheckScriptSuccess(lines)
1324 assert_false(exists('g:loaded_postponed'))
1325 CheckScriptSuccess(lines + ['Tryit()'])
1326 assert_equal('true', g:loaded_postponed)
1327
1328 unlet g:loaded_postponed
1329 delete('Xdir', 'rf')
1330 &rtp = save_rtp
1331enddef
1332
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00001333def Test_import_autoload_override()
1334 mkdir('Xdir/autoload', 'p')
1335 var save_rtp = &rtp
1336 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1337 test_override('autoload', 1)
1338
1339 var lines =<< trim END
1340 vim9script autoload
1341
1342 g:loaded_override = 'true'
1343 export var variable = 'bla'
1344 export def Function(): string
1345 return 'bla'
1346 enddef
1347 END
1348 writefile(lines, 'Xdir/autoload/override.vim')
1349
1350 lines =<< trim END
1351 vim9script
1352
1353 import autoload 'override.vim'
1354 assert_equal('true', g:loaded_override)
1355
1356 def Tryit()
1357 echo override.doesNotExist
1358 enddef
1359 defcompile
1360 END
1361 CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
1362
1363 test_override('autoload', 0)
1364 unlet g:loaded_override
1365 delete('Xdir', 'rf')
1366 &rtp = save_rtp
1367enddef
1368
Bram Moolenaar19db9e62022-01-11 11:58:19 +00001369def Test_autoload_mapping()
1370 mkdir('Xdir/autoload', 'p')
1371 var save_rtp = &rtp
1372 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1373
1374 var lines =<< trim END
1375 vim9script autoload
1376
1377 g:toggle_loaded = 'yes'
1378
1379 export def Toggle(): string
1380 return ":g:toggle_called = 'yes'\<CR>"
1381 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00001382 export def Doit()
1383 g:doit_called = 'yes'
1384 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00001385 END
1386 writefile(lines, 'Xdir/autoload/toggle.vim')
1387
1388 lines =<< trim END
1389 vim9script
1390
1391 import autoload 'toggle.vim'
1392
1393 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00001394 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
1395 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00001396 END
1397 CheckScriptSuccess(lines)
1398 assert_false(exists("g:toggle_loaded"))
1399 assert_false(exists("g:toggle_called"))
1400
1401 feedkeys("tt", 'xt')
1402 assert_equal('yes', g:toggle_loaded)
1403 assert_equal('yes', g:toggle_called)
1404
Bram Moolenaare32c3c42022-01-15 18:26:04 +00001405 feedkeys("xx", 'xt')
1406 assert_equal('yes', g:doit_called)
1407
1408 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
1409
Bram Moolenaar19db9e62022-01-11 11:58:19 +00001410 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00001411 nunmap xx
1412 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00001413 unlet g:toggle_loaded
1414 unlet g:toggle_called
1415 delete('Xdir', 'rf')
1416 &rtp = save_rtp
1417enddef
1418
Bram Moolenaar160aa862022-01-10 21:29:57 +00001419def Test_vim9script_autoload_fails()
1420 var lines =<< trim END
1421 vim9script autoload
1422 var n = 0
1423 END
1424 CheckScriptFailure(lines, 'E1263:')
1425enddef
1426
1427def Test_import_autoload_fails()
1428 var lines =<< trim END
1429 vim9script
1430 import autoload autoload 'prefixed.vim'
1431 END
1432 CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
1433
1434 lines =<< trim END
1435 vim9script
1436 import autoload 'doesNotExist.vim'
1437 END
1438 CheckScriptFailure(lines, 'E1264:')
1439enddef
1440
1441" test disassembling an auto-loaded function starting with "debug"
1442def Test_vim9_autoload_disass()
1443 mkdir('Xdir/autoload', 'p')
1444 var save_rtp = &rtp
1445 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1446
1447 var lines =<< trim END
1448 vim9script
1449 def debugit#test(): string
1450 return 'debug'
1451 enddef
1452 END
1453 writefile(lines, 'Xdir/autoload/debugit.vim')
1454
1455 lines =<< trim END
1456 vim9script
1457 def profileit#test(): string
1458 return 'profile'
1459 enddef
1460 END
1461 writefile(lines, 'Xdir/autoload/profileit.vim')
1462
1463 lines =<< trim END
1464 vim9script
1465 assert_equal('debug', debugit#test())
1466 disass debugit#test
1467 assert_equal('profile', profileit#test())
1468 disass profileit#test
1469 END
1470 CheckScriptSuccess(lines)
1471
1472 delete('Xdir', 'rf')
1473 &rtp = save_rtp
1474enddef
1475
1476" test using a vim9script that is auto-loaded from an autocmd
1477def Test_vim9_aucmd_autoload()
1478 var lines =<< trim END
1479 vim9script
1480 def foo#test()
1481 echomsg getreg('"')
1482 enddef
1483 END
1484
1485 mkdir('Xdir/autoload', 'p')
1486 writefile(lines, 'Xdir/autoload/foo.vim')
1487 var save_rtp = &rtp
1488 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1489 augroup test
1490 autocmd TextYankPost * call foo#test()
1491 augroup END
1492
1493 normal Y
1494
1495 augroup test
1496 autocmd!
1497 augroup END
1498 delete('Xdir', 'rf')
1499 &rtp = save_rtp
1500enddef
1501
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00001502" test using a autoloaded file that is case sensitive
1503def Test_vim9_autoload_case_sensitive()
1504 var lines =<< trim END
1505 vim9script autoload
1506 export def CaseSensitive(): string
1507 return 'done'
1508 enddef
1509 END
1510
1511 mkdir('Xdir/autoload', 'p')
1512 writefile(lines, 'Xdir/autoload/CaseSensitive.vim')
1513 var save_rtp = &rtp
1514 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1515
1516 lines =<< trim END
1517 vim9script
1518 import autoload 'CaseSensitive.vim'
1519 assert_equal('done', CaseSensitive.CaseSensitive())
1520 END
1521 CheckScriptSuccess(lines)
1522
Bram Moolenaarbfac4092022-01-16 11:12:12 +00001523 if !has('fname_case')
1524 lines =<< trim END
1525 vim9script
1526 import autoload 'CaseSensitive.vim'
1527 import autoload 'casesensitive.vim'
1528 END
1529 CheckScriptFailure(lines, 'E1262:')
1530 endif
1531
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00001532 delete('Xdir', 'rf')
1533 &rtp = save_rtp
1534enddef
1535
Bram Moolenaar160aa862022-01-10 21:29:57 +00001536" This was causing a crash because suppress_errthrow wasn't reset.
1537def Test_vim9_autoload_error()
1538 var lines =<< trim END
1539 vim9script
1540 def crash#func()
1541 try
1542 for x in List()
1543 endfor
1544 catch
1545 endtry
1546 g:ok = true
1547 enddef
1548 fu List()
1549 invalid
1550 endfu
1551 try
1552 alsoinvalid
1553 catch /wontmatch/
1554 endtry
1555 END
1556 call mkdir('Xruntime/autoload', 'p')
1557 call writefile(lines, 'Xruntime/autoload/crash.vim')
1558
1559 # run in a separate Vim to avoid the side effects of assert_fails()
1560 lines =<< trim END
1561 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
1562 call crash#func()
1563 call writefile(['ok'], 'Xdidit')
1564 qall!
1565 END
1566 writefile(lines, 'Xscript')
1567 RunVim([], [], '-S Xscript')
1568 assert_equal(['ok'], readfile('Xdidit'))
1569
1570 delete('Xdidit')
1571 delete('Xscript')
1572 delete('Xruntime', 'rf')
1573
1574 lines =<< trim END
1575 vim9script
1576 var foo#bar = 'asdf'
1577 END
1578 CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
1579enddef
1580
Bram Moolenaard8448622022-01-07 21:39:52 +00001581
1582" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker