blob: 7878788a0dc90b49601ecc78d1f56e0103b4312a [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 Moolenaar3e93a2b2022-01-24 21:28:01 +0000676def Test_use_autoload_import_partial_in_opfunc()
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 Opfunc(..._)
684 g:opfunc_called = 'yes'
685 enddef
686 END
687 writefile(lines, 'Xdir/autoload/opfunc.vim')
688
689 new
690 lines =<< trim END
691 vim9script
692 import autoload 'opfunc.vim'
693 nnoremap <expr> <F3> TheFunc()
694 def TheFunc(): string
695 &operatorfunc = function('opfunc.Opfunc', [0])
696 return 'g@'
697 enddef
698 feedkeys("\<F3>l", 'xt')
699 assert_equal('yes', g:opfunc_called)
700 END
701 CheckScriptSuccess(lines)
702
703 set opfunc=
704 bwipe!
705 delete('Xdir', 'rf')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000706 nunmap <F3>
707 &rtp = save_rtp
708enddef
709
710def Test_set_opfunc_to_autoload_func_directly()
711 mkdir('Xdir/autoload', 'p')
712 var save_rtp = &rtp
713 exe 'set rtp^=' .. getcwd() .. '/Xdir'
714
715 var lines =<< trim END
716 vim9script
717 export def Opfunc(..._)
718 g:opfunc_called = 'yes'
719 enddef
720 END
721 writefile(lines, 'Xdir/autoload/opfunc.vim')
722
723 new
724 lines =<< trim END
725 vim9script
726 import autoload 'opfunc.vim'
727 nnoremap <expr> <F3> TheFunc()
728 def TheFunc(): string
729 &operatorfunc = opfunc.Opfunc
730 return 'g@'
731 enddef
732 feedkeys("\<F3>l", 'xt')
733 assert_equal('yes', g:opfunc_called)
734 END
735 CheckScriptSuccess(lines)
736
737 set opfunc=
738 bwipe!
739 delete('Xdir', 'rf')
740 nunmap <F3>
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000741 &rtp = save_rtp
742enddef
743
Bram Moolenaare70dd112022-01-21 16:31:11 +0000744def Test_use_autoload_import_in_fold_expression()
745 mkdir('Xdir/autoload', 'p')
746 var save_rtp = &rtp
747 exe 'set rtp^=' .. getcwd() .. '/Xdir'
748
749 var lines =<< trim END
750 vim9script
751 export def Expr(): string
752 return getline(v:lnum) =~ '^#' ? '>1' : '1'
753 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000754 export def Text(): string
755 return 'fold text'
756 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000757 g:fold_loaded = 'yes'
758 END
759 writefile(lines, 'Xdir/autoload/fold.vim')
760
761 lines =<< trim END
762 vim9script
763 import autoload 'fold.vim'
764 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000765 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000766 &foldmethod = 'expr'
767 &debug = 'throw'
768 END
769 new
770 setline(1, ['# one', 'text', '# two', 'text'])
771 g:fold_loaded = 'no'
772 CheckScriptSuccess(lines)
773 assert_equal('no', g:fold_loaded)
774 redraw
775 assert_equal('yes', g:fold_loaded)
776
777 # Check that script context of 'foldexpr' is copied to another buffer.
778 edit! otherfile
779 redraw
780
Bram Moolenaar9530b582022-01-22 13:39:08 +0000781 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +0000782 bwipe!
783 delete('Xdir', 'rf')
784 &rtp = save_rtp
785enddef
786
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +0000787func Test_import_in_diffexpr()
788 CheckExecutable diff
789
790 call Run_Test_import_in_diffexpr()
791endfunc
792
793def Run_Test_import_in_diffexpr()
794 var lines =<< trim END
795 vim9script
796
797 export def DiffExpr()
798 # Prepend some text to check diff type detection
799 writefile(['warning', ' message'], v:fname_out)
800 silent exe '!diff ' .. v:fname_in .. ' '
801 .. v:fname_new .. '>>' .. v:fname_out
802 enddef
803 END
804 writefile(lines, 'Xdiffexpr')
805
806 lines =<< trim END
807 vim9script
808 import './Xdiffexpr' as diff
809
810 set diffexpr=diff.DiffExpr()
811 set diffopt=foldcolumn:0
812 END
813 CheckScriptSuccess(lines)
814
815 enew!
816 call setline(1, ['one', 'two', 'three'])
817 diffthis
818
819 botright vert new
820 call setline(1, ['one', 'two', 'three.'])
821 diffthis
822 # we only check if this does not cause errors
823 redraw
824
825 diffoff!
826 bwipe!
827 bwipe!
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +0000828 delete('Xdiffexpr')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +0000829enddef
830
Bram Moolenaar36c2add2022-01-22 20:55:30 +0000831def Test_import_in_patchexpr()
832 var lines =<< trim END
833 vim9script
834 export def TPatch()
835 call writefile(['output file'], v:fname_out)
836 enddef
837 END
838 writefile(lines, 'Xpatchexpr')
839
840 lines =<< trim END
841 vim9script
842 import './Xpatchexpr' as patch
843 set patchexpr=patch.TPatch()
844 END
845 CheckScriptSuccess(lines)
846
847 call writefile(['input file'], 'Xinput')
848 call writefile(['diff file'], 'Xdiff')
849 :%bwipe!
850 edit Xinput
851 diffpatch Xdiff
852 call assert_equal('output file', getline(1))
853
854 call delete('Xinput')
855 call delete('Xdiff')
856 call delete('Xpatchexpr')
857 set patchexpr&
858 :%bwipe!
859enddef
860
Bram Moolenaar3ba685e2022-01-22 19:17:31 +0000861def Test_import_in_formatexpr()
862 var lines =<< trim END
863 vim9script
864 export def MyFormatExpr(): number
865 g:did_format = 'yes'
866 return 0
867 enddef
868 END
869 writefile(lines, 'Xformatter')
870
871 lines =<< trim END
872 vim9script
873 import './Xformatter' as format
874 set formatexpr=format.MyFormatExpr()
875 END
876 CheckScriptSuccess(lines)
877
878 new
879 setline(1, ['a', 'b', 'c'])
880 normal gqG
881 assert_equal('yes', g:did_format)
882
883 bwipe!
884 delete('Xformatter')
885 unlet g:did_format
886 set formatexpr=
887enddef
888
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +0000889def Test_import_in_includeexpr()
890 writefile(['found it'], 'Xthisfile')
891 new
892
893 var lines =<< trim END
894 vim9script
895 export def DoSub(): string
896 return substitute(v:fname, 'that', 'this', '')
897 enddef
898 END
899 writefile(lines, 'Xinclude.vim')
900
901 lines =<< trim END
902 vim9script
903 import './Xinclude.vim'
904 set includeexpr=Xinclude.DoSub()
905 END
906 CheckScriptSuccess(lines)
907
908 setline(1, ['Xthatfile'])
909 exe "normal \<C-W>f"
910 assert_equal('Xthisfile', expand('%'))
911
912 bwipe!
913 bwipe!
914 set includeexpr=
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +0000915 delete('Xinclude.vim')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +0000916 delete('Xthisfile')
917enddef
918
Bram Moolenaar28e60cc2022-01-22 20:32:00 +0000919def Test_import_in_indentexpr()
920 var lines =<< trim END
921 vim9script
922 export def GetIndent(): number
923 return 5
924 enddef
925 END
926 writefile(lines, 'Xindenter')
927
928 lines =<< trim END
929 vim9script
930 import './Xindenter' as indent
931 set indentexpr=indent.GetIndent()
932 set debug=throw
933 END
934 CheckScriptSuccess(lines)
935
936 new
937 setline(1, 'hello')
938 normal ==
939 assert_equal(' hello', getline(1))
940
941 bwipe!
942 set indentexpr= debug=
943 delete('Xindenter')
944enddef
945
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +0000946func Test_import_in_printexpr()
947 CheckFeature postscript
948 call Run_Test_import_in_printexpr()
949endfunc
950
951def Run_Test_import_in_printexpr()
952 var lines =<< trim END
953 vim9script
954 export def PrintFile(): bool
955 g:printed = 'yes'
956 delete('v:fname_in')
957 return false
958 enddef
959 END
960 writefile(lines, 'Xprint.vim')
961
962 lines =<< trim END
963 vim9script
964 import './Xprint.vim'
965 set printexpr=Xprint.PrintFile()
966 END
967 CheckScriptSuccess(lines)
968
969 help
970 hardcopy dummy args
971 assert_equal('yes', g:printed)
972
973 delete('Xprint.vim')
974 set printexpr=
975enddef
976
Bram Moolenaarf4e88f22022-01-23 14:17:28 +0000977def Test_import_in_charconvert()
978 var lines =<< trim END
979 vim9script
980 export def MakeUpper(): bool
981 var data = readfile(v:fname_in)
982 map(data, 'toupper(v:val)')
983 writefile(data, v:fname_out)
984 return false # success
985 enddef
986 END
987 writefile(lines, 'Xconvert.vim')
988
989 lines =<< trim END
990 vim9script
991 import './Xconvert.vim' as conv
992 set charconvert=conv.MakeUpper()
993 END
994 CheckScriptSuccess(lines)
995
996 writefile(['one', 'two'], 'Xfile')
997 new Xfile
998 write ++enc=ucase Xfile1
999 assert_equal(['ONE', 'TWO'], readfile('Xfile1'))
1000
1001 delete('Xfile')
1002 delete('Xfile1')
1003 delete('Xconvert.vim')
1004 bwipe!
1005 set charconvert&
1006enddef
1007
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001008func Test_import_in_spellsuggest_expr()
1009 CheckFeature spell
1010 call Run_Test_import_in_spellsuggest_expr()
1011endfunc
1012
1013def Run_Test_import_in_spellsuggest_expr()
1014 var lines =<< trim END
1015 vim9script
1016 export def MySuggest(): list<any>
1017 return [['Fox', 8], ['Fop', 9]]
1018 enddef
1019 END
1020 writefile(lines, 'Xsuggest.vim')
1021
1022 lines =<< trim END
1023 vim9script
1024 import './Xsuggest.vim' as sugg
1025 set spell spellsuggest=expr:sugg.MySuggest()
1026 END
1027 CheckScriptSuccess(lines)
1028
1029 set verbose=1 # report errors
1030 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
1031
1032 delete('Xsuggest.vim')
1033 set nospell spellsuggest& verbose=0
1034enddef
1035
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001036def Test_export_shadows_global_function()
1037 mkdir('Xdir/autoload', 'p')
1038 var save_rtp = &rtp
1039 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1040
1041 var lines =<< trim END
1042 vim9script
1043 export def Shadow(): string
1044 return 'Shadow()'
1045 enddef
1046 END
1047 writefile(lines, 'Xdir/autoload/shadow.vim')
1048
1049 lines =<< trim END
1050 vim9script
1051
1052 def g:Shadow(): string
1053 return 'global'
1054 enddef
1055
1056 import autoload 'shadow.vim'
1057 assert_equal('Shadow()', shadow.Shadow())
1058 END
1059 CheckScriptSuccess(lines)
1060
1061 delfunc g:Shadow
1062 bwipe!
1063 delete('Xdir', 'rf')
1064 &rtp = save_rtp
1065enddef
1066
Bram Moolenaard8448622022-01-07 21:39:52 +00001067def Test_export_fails()
1068 CheckScriptFailure(['export var some = 123'], 'E1042:')
1069 CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1070 CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
1071
1072 assert_fails('export something', 'E1043:')
1073enddef
1074
1075func Test_import_fails_without_script()
1076 CheckRunVimInTerminal
1077
1078 " call indirectly to avoid compilation error for missing functions
1079 call Run_Test_import_fails_on_command_line()
1080endfunc
1081
1082def Run_Test_import_fails_on_command_line()
1083 var export =<< trim END
1084 vim9script
1085 export def Foo(): number
1086 return 0
1087 enddef
1088 END
1089 writefile(export, 'XexportCmd.vim')
1090
1091 var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
1092 rows: 6, wait_for_ruler: 0})
1093 WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
1094
1095 delete('XexportCmd.vim')
1096 StopVimInTerminal(buf)
1097enddef
1098
1099def Test_vim9_reload_noclear()
1100 var lines =<< trim END
1101 vim9script
1102 export var exported = 'thexport'
1103
1104 export def TheFunc(x = 0)
1105 enddef
1106 END
1107 writefile(lines, 'XExportReload')
1108 lines =<< trim END
1109 vim9script noclear
1110 g:loadCount += 1
1111 var s:reloaded = 'init'
1112 import './XExportReload' as exp
1113
1114 def Again(): string
1115 return 'again'
1116 enddef
1117
1118 exp.TheFunc()
1119
1120 if exists('s:loaded') | finish | endif
1121 var s:loaded = true
1122
1123 var s:notReloaded = 'yes'
1124 s:reloaded = 'first'
1125 def g:Values(): list<string>
1126 return [s:reloaded, s:notReloaded, Again(), Once(), exp.exported]
1127 enddef
1128
1129 def Once(): string
1130 return 'once'
1131 enddef
1132 END
1133 writefile(lines, 'XReloaded')
1134 g:loadCount = 0
1135 source XReloaded
1136 assert_equal(1, g:loadCount)
1137 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1138 source XReloaded
1139 assert_equal(2, g:loadCount)
1140 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1141 source XReloaded
1142 assert_equal(3, g:loadCount)
1143 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1144
1145 delete('XReloaded')
1146 delete('XExportReload')
1147 delfunc g:Values
1148 unlet g:loadCount
1149
1150 lines =<< trim END
1151 vim9script
1152 def Inner()
1153 enddef
1154 END
1155 lines->writefile('XreloadScript.vim')
1156 source XreloadScript.vim
1157
1158 lines =<< trim END
1159 vim9script
1160 def Outer()
1161 def Inner()
1162 enddef
1163 enddef
1164 defcompile
1165 END
1166 lines->writefile('XreloadScript.vim')
1167 source XreloadScript.vim
1168
1169 delete('XreloadScript.vim')
1170enddef
1171
1172def Test_vim9_reload_import()
1173 var lines =<< trim END
1174 vim9script
1175 const var = ''
1176 var valone = 1234
1177 def MyFunc(arg: string)
1178 valone = 5678
1179 enddef
1180 END
1181 var morelines =<< trim END
1182 var valtwo = 222
1183 export def GetValtwo(): number
1184 return valtwo
1185 enddef
1186 END
1187 writefile(lines + morelines, 'Xreload.vim')
1188 source Xreload.vim
1189 source Xreload.vim
1190 source Xreload.vim
1191
1192 # cannot declare a var twice
1193 lines =<< trim END
1194 vim9script
1195 var valone = 1234
1196 var valone = 5678
1197 END
1198 writefile(lines, 'Xreload.vim')
1199 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1200
1201 delete('Xreload.vim')
1202 delete('Ximport.vim')
1203enddef
1204
1205" if a script is reloaded with a script-local variable that changed its type, a
1206" compiled function using that variable must fail.
1207def Test_script_reload_change_type()
1208 var lines =<< trim END
1209 vim9script noclear
1210 var str = 'string'
1211 def g:GetStr(): string
1212 return str .. 'xxx'
1213 enddef
1214 END
1215 writefile(lines, 'Xreload.vim')
1216 source Xreload.vim
1217 echo g:GetStr()
1218
1219 lines =<< trim END
1220 vim9script noclear
1221 var str = 1234
1222 END
1223 writefile(lines, 'Xreload.vim')
1224 source Xreload.vim
1225 assert_fails('echo g:GetStr()', 'E1150:')
1226
1227 delfunc g:GetStr
1228 delete('Xreload.vim')
1229enddef
1230
1231" Define CallFunc so that the test can be compiled
1232command CallFunc echo 'nop'
1233
1234def Test_script_reload_from_function()
1235 var lines =<< trim END
1236 vim9script
1237
1238 if exists('g:loaded')
1239 finish
1240 endif
1241 g:loaded = 1
1242 delcommand CallFunc
1243 command CallFunc Func()
1244 def Func()
1245 so XreloadFunc.vim
1246 g:didTheFunc = 1
1247 enddef
1248 END
1249 writefile(lines, 'XreloadFunc.vim')
1250 source XreloadFunc.vim
1251 CallFunc
1252 assert_equal(1, g:didTheFunc)
1253
1254 delete('XreloadFunc.vim')
1255 delcommand CallFunc
1256 unlet g:loaded
1257 unlet g:didTheFunc
1258enddef
1259
1260def s:RetSome(): string
1261 return 'some'
1262enddef
1263
1264" Not exported function that is referenced needs to be accessed by the
1265" script-local name.
1266def Test_vim9_funcref()
1267 var sortlines =<< trim END
1268 vim9script
1269 def Compare(i1: number, i2: number): number
1270 return i2 - i1
1271 enddef
1272
1273 export def FastSort(): list<number>
1274 return range(5)->sort(Compare)
1275 enddef
1276
1277 export def GetString(arg: string): string
1278 return arg
1279 enddef
1280 END
1281 writefile(sortlines, 'Xsort.vim')
1282
1283 var lines =<< trim END
1284 vim9script
1285 import './Xsort.vim'
1286 def Test()
1287 g:result = Xsort.FastSort()
1288 enddef
1289 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001290 END
1291 writefile(lines, 'Xscript.vim')
1292 source Xscript.vim
1293 assert_equal([4, 3, 2, 1, 0], g:result)
1294 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00001295
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001296 lines =<< trim END
1297 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00001298 # using a function imported with "as"
1299 import './Xsort.vim' as anAlias
1300 assert_equal('yes', anAlias.GetString('yes'))
1301
1302 # using the function from a compiled function
1303 def TestMore(): string
1304 var s = s:anAlias.GetString('foo')
1305 return s .. anAlias.GetString('bar')
1306 enddef
1307 assert_equal('foobar', TestMore())
1308
1309 # error when using a function that isn't exported
1310 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1311 END
1312 writefile(lines, 'Xscript.vim')
1313
Bram Moolenaard8448622022-01-07 21:39:52 +00001314 delete('Xsort.vim')
1315 delete('Xscript.vim')
1316
1317 var Funcref = function('s:RetSome')
1318 assert_equal('some', Funcref())
1319enddef
1320
1321" Check that when searching for "FilterFunc" it finds the import in the
1322" script where FastFilter() is called from, both as a string and as a direct
1323" function reference.
1324def Test_vim9_funcref_other_script()
1325 var filterLines =<< trim END
1326 vim9script
1327 export def FilterFunc(idx: number, val: number): bool
1328 return idx % 2 == 1
1329 enddef
1330 export def FastFilter(): list<number>
1331 return range(10)->filter('FilterFunc(v:key, v:val)')
1332 enddef
1333 export def FastFilterDirect(): list<number>
1334 return range(10)->filter(FilterFunc)
1335 enddef
1336 END
1337 writefile(filterLines, 'Xfilter.vim')
1338
1339 var lines =<< trim END
1340 vim9script
1341 import './Xfilter.vim' as filter
1342 def Test()
1343 var x: list<number> = filter.FastFilter()
1344 enddef
1345 Test()
1346 def TestDirect()
1347 var x: list<number> = filter.FastFilterDirect()
1348 enddef
1349 TestDirect()
1350 END
1351 CheckScriptSuccess(lines)
1352 delete('Xfilter.vim')
1353enddef
1354
1355def Test_import_absolute()
1356 var import_lines = [
1357 'vim9script',
1358 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
1359 'def UseExported()',
1360 ' g:imported_abs = abs.exported',
1361 ' abs.exported = 8888',
1362 ' g:imported_after = abs.exported',
1363 'enddef',
1364 'UseExported()',
1365 'g:import_disassembled = execute("disass UseExported")',
1366 ]
1367 writefile(import_lines, 'Ximport_abs.vim')
1368 writefile(s:export_script_lines, 'Xexport_abs.vim')
1369
1370 source Ximport_abs.vim
1371
1372 assert_equal(9876, g:imported_abs)
1373 assert_equal(8888, g:imported_after)
1374 assert_match('<SNR>\d\+_UseExported\_s*' ..
1375 'g:imported_abs = abs.exported\_s*' ..
1376 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1377 '1 STOREG g:imported_abs\_s*' ..
1378 'abs.exported = 8888\_s*' ..
1379 '2 PUSHNR 8888\_s*' ..
1380 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1381 'g:imported_after = abs.exported\_s*' ..
1382 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1383 '5 STOREG g:imported_after',
1384 g:import_disassembled)
1385
1386 Undo_export_script_lines()
1387 unlet g:imported_abs
1388 unlet g:import_disassembled
1389
1390 delete('Ximport_abs.vim')
1391 delete('Xexport_abs.vim')
1392enddef
1393
1394def Test_import_rtp()
1395 var import_lines = [
1396 'vim9script',
1397 'import "Xexport_rtp.vim" as rtp',
1398 'g:imported_rtp = rtp.exported',
1399 ]
1400 writefile(import_lines, 'Ximport_rtp.vim')
1401 mkdir('import', 'p')
1402 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1403
1404 var save_rtp = &rtp
1405 &rtp = getcwd()
1406 source Ximport_rtp.vim
1407 &rtp = save_rtp
1408
1409 assert_equal(9876, g:imported_rtp)
1410
1411 Undo_export_script_lines()
1412 unlet g:imported_rtp
1413 delete('Ximport_rtp.vim')
1414 delete('import', 'rf')
1415enddef
1416
1417def Test_import_compile_error()
1418 var export_lines = [
1419 'vim9script',
1420 'export def ExpFunc(): string',
1421 ' return notDefined',
1422 'enddef',
1423 ]
1424 writefile(export_lines, 'Xexported.vim')
1425
1426 var import_lines = [
1427 'vim9script',
1428 'import "./Xexported.vim" as expo',
1429 'def ImpFunc()',
1430 ' echo expo.ExpFunc()',
1431 'enddef',
1432 'defcompile',
1433 ]
1434 writefile(import_lines, 'Ximport.vim')
1435
1436 try
1437 source Ximport.vim
1438 catch /E1001/
1439 # Error should be before the Xexported.vim file.
1440 assert_match('E1001: Variable not found: notDefined', v:exception)
1441 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1442 endtry
1443
1444 delete('Xexported.vim')
1445 delete('Ximport.vim')
1446enddef
1447
1448def Test_func_overrules_import_fails()
1449 var export_lines =<< trim END
1450 vim9script
1451 export def Func()
1452 echo 'imported'
1453 enddef
1454 END
1455 writefile(export_lines, 'XexportedFunc.vim')
1456
1457 var lines =<< trim END
1458 vim9script
1459 import './XexportedFunc.vim' as Func
1460 def Func()
1461 echo 'local to function'
1462 enddef
1463 END
Bram Moolenaar937610b2022-01-19 17:21:29 +00001464 CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00001465
1466 lines =<< trim END
1467 vim9script
1468 import './XexportedFunc.vim' as Func
1469 def Outer()
1470 def Func()
1471 echo 'local to function'
1472 enddef
1473 enddef
1474 defcompile
1475 END
1476 CheckScriptFailure(lines, 'E1236:')
1477
1478 delete('XexportedFunc.vim')
1479enddef
1480
1481def Test_source_vim9_from_legacy()
1482 var vim9_lines =<< trim END
1483 vim9script
1484 var local = 'local'
1485 g:global = 'global'
1486 export var exported = 'exported'
1487 export def GetText(): string
1488 return 'text'
1489 enddef
1490 END
1491 writefile(vim9_lines, 'Xvim9_script.vim')
1492
1493 var legacy_lines =<< trim END
1494 source Xvim9_script.vim
1495
1496 call assert_false(exists('local'))
1497 call assert_false(exists('exported'))
1498 call assert_false(exists('s:exported'))
1499 call assert_equal('global', global)
1500 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00001501 END
1502 writefile(legacy_lines, 'Xlegacy_script.vim')
1503
1504 source Xlegacy_script.vim
1505 assert_equal('global', g:global)
1506 unlet g:global
1507
1508 delete('Xlegacy_script.vim')
1509 delete('Xvim9_script.vim')
1510enddef
1511
Bram Moolenaarc43e6232022-01-13 20:51:56 +00001512def Test_import_vim9_from_legacy()
1513 var vim9_lines =<< trim END
1514 vim9script
1515 var local = 'local'
1516 g:global = 'global'
1517 export var exported = 'exported'
1518 export def GetText(): string
1519 return 'text'
1520 enddef
1521 END
1522 writefile(vim9_lines, 'Xvim9_export.vim')
1523
1524 var legacy_lines =<< trim END
1525 import './Xvim9_export.vim' as vim9
1526
1527 call assert_false(exists('vim9'))
1528 call assert_false(exists('local'))
1529 call assert_false(exists('s:vim9.local'))
1530 call assert_equal('global', global)
1531 call assert_equal('global', g:global)
1532 call assert_false(exists('exported'))
1533 call assert_false(exists('s:exported'))
1534 call assert_false(exists('*GetText'))
1535
1536 " imported symbol is script-local
1537 call assert_equal('exported', s:vim9.exported)
1538 call assert_equal('text', s:vim9.GetText())
1539 END
1540 writefile(legacy_lines, 'Xlegacy_script.vim')
1541
1542 source Xlegacy_script.vim
1543 assert_equal('global', g:global)
1544 unlet g:global
1545
1546 delete('Xlegacy_script.vim')
1547 delete('Xvim9_export.vim')
1548enddef
1549
Bram Moolenaard8448622022-01-07 21:39:52 +00001550def Test_cmdline_win()
1551 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
1552 # the command line window.
1553 mkdir('rtp/syntax', 'p')
1554 var export_lines =<< trim END
1555 vim9script
1556 export var That = 'yes'
1557 END
1558 writefile(export_lines, 'rtp/syntax/Xexport.vim')
1559 var import_lines =<< trim END
1560 vim9script
1561 import './Xexport.vim' as exp
1562 echo exp.That
1563 END
1564 writefile(import_lines, 'rtp/syntax/vim.vim')
1565 var save_rtp = &rtp
1566 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
1567 syntax on
1568 augroup CmdWin
1569 autocmd CmdwinEnter * g:got_there = 'yes'
1570 augroup END
1571 # this will open and also close the cmdline window
1572 feedkeys('q:', 'xt')
1573 assert_equal('yes', g:got_there)
1574
1575 augroup CmdWin
1576 au!
1577 augroup END
1578 &rtp = save_rtp
1579 delete('rtp', 'rf')
1580enddef
1581
1582def Test_import_gone_when_sourced_twice()
1583 var exportlines =<< trim END
1584 vim9script
1585 if exists('g:guard')
1586 finish
1587 endif
1588 g:guard = 1
1589 export var name = 'someName'
1590 END
1591 writefile(exportlines, 'XexportScript.vim')
1592
1593 var lines =<< trim END
1594 vim9script
1595 import './XexportScript.vim' as expo
1596 def g:GetName(): string
1597 return expo.name
1598 enddef
1599 END
1600 writefile(lines, 'XscriptImport.vim')
1601 so XscriptImport.vim
1602 assert_equal('someName', g:GetName())
1603
1604 so XexportScript.vim
1605 assert_fails('call g:GetName()', 'E1149:')
1606
1607 delfunc g:GetName
1608 delete('XexportScript.vim')
1609 delete('XscriptImport.vim')
1610 unlet g:guard
1611enddef
1612
Bram Moolenaar160aa862022-01-10 21:29:57 +00001613" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001614def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00001615 var lines =<< trim END
1616 vim9script
1617 def some#gettest(): string
1618 return 'test'
1619 enddef
1620 g:some#name = 'name'
1621 g:some#dict = {key: 'value'}
1622
1623 def some#varargs(a1: string, ...l: list<string>): string
1624 return a1 .. l[0] .. l[1]
1625 enddef
1626 END
1627
1628 mkdir('Xdir/autoload', 'p')
1629 writefile(lines, 'Xdir/autoload/some.vim')
1630 var save_rtp = &rtp
1631 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1632
1633 assert_equal('test', g:some#gettest())
1634 assert_equal('name', g:some#name)
1635 assert_equal('value', g:some#dict.key)
1636 g:some#other = 'other'
1637 assert_equal('other', g:some#other)
1638
1639 assert_equal('abc', some#varargs('a', 'b', 'c'))
1640
1641 # upper case script name works
1642 lines =<< trim END
1643 vim9script
1644 def Other#getOther(): string
1645 return 'other'
1646 enddef
1647 END
1648 writefile(lines, 'Xdir/autoload/Other.vim')
1649 assert_equal('other', g:Other#getOther())
1650
1651 delete('Xdir', 'rf')
1652 &rtp = save_rtp
1653enddef
1654
1655def Test_vim9script_autoload()
1656 mkdir('Xdir/autoload', 'p')
1657 var save_rtp = &rtp
1658 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1659
Bram Moolenaarfd218c82022-01-18 16:26:24 +00001660 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00001661 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00001662 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001663 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00001664
1665 export def Gettest(): string
1666 return 'test'
1667 enddef
1668
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001669 export var name = 'name'
1670
1671 export func GetFunc()
1672 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00001673 endfunc
1674
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001675 export def GetDef(): string
1676 return Gettest() .. 'more' .. name
1677 enddef
1678
Bram Moolenaar160aa862022-01-10 21:29:57 +00001679 export final fname = 'final'
1680 export const cname = 'const'
1681 END
1682 writefile(lines, 'Xdir/autoload/prefixed.vim')
1683
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001684 g:prefixed_loaded = 0
1685 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00001686 lines =<< trim END
1687 vim9script
1688 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001689 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001690 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001691 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001692
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001693 assert_equal('testmorename', prefixed.GetFunc())
1694 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00001695 assert_equal('name', prefixed.name)
1696 assert_equal('final', prefixed.fname)
1697 assert_equal('const', prefixed.cname)
1698 END
1699 CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00001700 # can source it again, autoload script not loaded again
1701 g:expected_loaded = 1
1702 CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00001703
1704 # can also get the items by autoload name
1705 lines =<< trim END
1706 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00001707 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00001708 call assert_equal('name', prefixed#name)
1709 call assert_equal('final', prefixed#fname)
1710 call assert_equal('const', prefixed#cname)
1711 END
1712 CheckScriptSuccess(lines)
1713
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001714 unlet g:prefixed_loaded
1715 unlet g:expected_loaded
1716 delete('Xdir', 'rf')
1717 &rtp = save_rtp
1718enddef
1719
Bram Moolenaard02dce22022-01-18 17:43:04 +00001720def Test_import_autoload_not_exported()
1721 mkdir('Xdir/autoload', 'p')
1722 var save_rtp = &rtp
1723 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1724
1725 # error when using an item that is not exported from an autoload script
1726 var exportLines =<< trim END
1727 vim9script
1728 var notExported = 123
1729 def NotExport()
1730 echo 'nop'
1731 enddef
1732 END
1733 writefile(exportLines, 'Xdir/autoload/notExport1.vim')
1734
1735 var lines =<< trim END
1736 vim9script
1737 import autoload 'notExport1.vim'
1738 echo notExport1.notFound
1739 END
1740 CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
1741
1742 lines =<< trim END
1743 vim9script
1744 import autoload 'notExport1.vim'
1745 echo notExport1.notExported
1746 END
1747 CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
1748
1749 lines =<< trim END
1750 vim9script
1751 import autoload 'notExport1.vim'
1752 echo notExport1.NotFunc()
1753 END
1754 CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
1755
1756 lines =<< trim END
1757 vim9script
1758 import autoload 'notExport1.vim'
1759 echo notExport1.NotExport()
1760 END
1761 CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
1762
1763 lines =<< trim END
1764 vim9script
1765 import autoload 'notExport1.vim'
1766 echo 'text'->notExport1.NotFunc()
1767 END
1768 CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
1769
1770 lines =<< trim END
1771 vim9script
1772 import autoload 'notExport1.vim'
1773 echo 'text'->notExport1.NotExport()
1774 END
1775 CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
1776
1777 # using a :def function we use a different autoload script every time so that
1778 # the function is compiled without the script loaded
1779 writefile(exportLines, 'Xdir/autoload/notExport2.vim')
1780 lines =<< trim END
1781 vim9script
1782 import autoload 'notExport2.vim'
1783 def Testit()
1784 echo notExport2.notFound
1785 enddef
1786 Testit()
1787 END
1788 CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
1789
1790 writefile(exportLines, 'Xdir/autoload/notExport3.vim')
1791 lines =<< trim END
1792 vim9script
1793 import autoload 'notExport3.vim'
1794 def Testit()
1795 echo notExport3.notExported
1796 enddef
1797 Testit()
1798 END
1799 # don't get E1049 because it is too complicated to figure out
1800 CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
1801
1802 writefile(exportLines, 'Xdir/autoload/notExport4.vim')
1803 lines =<< trim END
1804 vim9script
1805 import autoload 'notExport4.vim'
1806 def Testit()
1807 echo notExport4.NotFunc()
1808 enddef
1809 Testit()
1810 END
1811 CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
1812
1813 writefile(exportLines, 'Xdir/autoload/notExport5.vim')
1814 lines =<< trim END
1815 vim9script
1816 import autoload 'notExport5.vim'
1817 def Testit()
1818 echo notExport5.NotExport()
1819 enddef
1820 Testit()
1821 END
1822 CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
1823
1824 writefile(exportLines, 'Xdir/autoload/notExport6.vim')
1825 lines =<< trim END
1826 vim9script
1827 import autoload 'notExport6.vim'
1828 def Testit()
1829 echo 'text'->notExport6.NotFunc()
1830 enddef
1831 Testit()
1832 END
1833 CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
1834
1835 writefile(exportLines, 'Xdir/autoload/notExport7.vim')
1836 lines =<< trim END
1837 vim9script
1838 import autoload 'notExport7.vim'
1839 def Testit()
1840 echo 'text'->notExport7.NotExport()
1841 enddef
1842 Testit()
1843 END
1844 CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
1845
1846 delete('Xdir', 'rf')
1847 &rtp = save_rtp
1848enddef
1849
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001850def Test_vim9script_autoload_call()
1851 mkdir('Xdir/autoload', 'p')
1852 var save_rtp = &rtp
1853 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1854
1855 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00001856 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001857
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00001858 export def RetArg(arg: string): string
1859 return arg
1860 enddef
1861
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001862 export def Getother()
1863 g:result = 'other'
1864 enddef
1865 END
Bram Moolenaar5d982692022-01-12 15:15:27 +00001866 writefile(lines, 'Xdir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001867
1868 lines =<< trim END
1869 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00001870 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00001871
1872 # compile this before 'another.vim' is loaded
1873 def CallAnother()
1874 assert_equal('foo', 'foo'->another.RetArg())
1875 enddef
1876 CallAnother()
1877
Bram Moolenaar5d982692022-01-12 15:15:27 +00001878 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001879 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00001880
1881 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00001882 END
1883 CheckScriptSuccess(lines)
1884
1885 unlet g:result
Bram Moolenaar160aa862022-01-10 21:29:57 +00001886 delete('Xdir', 'rf')
1887 &rtp = save_rtp
1888enddef
1889
Bram Moolenaarb697dc22022-01-22 11:27:29 +00001890def Test_vim9script_noclear_autoload()
1891 mkdir('Xdir/autoload', 'p')
1892 var save_rtp = &rtp
1893 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1894
1895 var lines =<< trim END
1896 vim9script
1897 export def Func(): string
1898 return 'called'
1899 enddef
1900 g:double_loaded = 'yes'
1901 END
1902 writefile(lines, 'Xdir/autoload/double.vim')
1903
1904 lines =<< trim END
1905 vim9script noclear
1906 if exists('g:script_loaded')
1907 finish
1908 endif
1909 g:script_loaded = true
1910
1911 import autoload 'double.vim'
1912 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
1913 END
1914 g:double_loaded = 'no'
1915 writefile(lines, 'Xloaddouble')
1916 source Xloaddouble
1917 assert_equal('no', g:double_loaded)
1918 assert_equal(true, g:script_loaded)
1919 source Xloaddouble
1920 feedkeys("\<F3>", 'xt')
1921 assert_equal('called', g:result)
1922 assert_equal('yes', g:double_loaded)
1923
1924 delete('Xloaddouble')
1925 unlet g:double_loaded
1926 unlet g:script_loaded
1927 unlet g:result
1928 delete('Xdir', 'rf')
1929 &rtp = save_rtp
1930enddef
1931
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00001932def Test_vim9script_autoload_duplicate()
1933 mkdir('Xdir/autoload', 'p')
1934
1935 var lines =<< trim END
1936 vim9script
1937
1938 export def Func()
1939 enddef
1940
1941 def Func()
1942 enddef
1943 END
1944 writefile(lines, 'Xdir/autoload/dupfunc.vim')
1945 assert_fails('source Xdir/autoload/dupfunc.vim', 'E1073:')
1946
1947 lines =<< trim END
1948 vim9script
1949
1950 def Func()
1951 enddef
1952
1953 export def Func()
1954 enddef
1955 END
1956 writefile(lines, 'Xdir/autoload/dup2func.vim')
1957 assert_fails('source Xdir/autoload/dup2func.vim', 'E1073:')
1958
1959 lines =<< trim END
1960 vim9script
1961
1962 def Func()
1963 enddef
1964
1965 export var Func = 'asdf'
1966 END
1967 writefile(lines, 'Xdir/autoload/dup3func.vim')
1968 assert_fails('source Xdir/autoload/dup3func.vim', 'E1041: Redefining script item Func')
1969
1970 lines =<< trim END
1971 vim9script
1972
1973 export var Func = 'asdf'
1974
1975 def Func()
1976 enddef
1977 END
1978 writefile(lines, 'Xdir/autoload/dup4func.vim')
1979 assert_fails('source Xdir/autoload/dup4func.vim', 'E707:')
1980
1981 lines =<< trim END
1982 vim9script
1983
1984 var Func = 'asdf'
1985
1986 export def Func()
1987 enddef
1988 END
1989 writefile(lines, 'Xdir/autoload/dup5func.vim')
1990 assert_fails('source Xdir/autoload/dup5func.vim', 'E707:')
1991
1992 lines =<< trim END
1993 vim9script
1994
1995 export def Func()
1996 enddef
1997
1998 var Func = 'asdf'
1999 END
2000 writefile(lines, 'Xdir/autoload/dup6func.vim')
2001 assert_fails('source Xdir/autoload/dup6func.vim', 'E1041: Redefining script item Func')
2002
2003 delete('Xdir', 'rf')
2004enddef
2005
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002006def Test_autoload_missing_function_name()
2007 mkdir('Xdir/autoload', 'p')
2008
2009 var lines =<< trim END
2010 vim9script
2011
2012 def loadme#()
2013 enddef
2014 END
2015 writefile(lines, 'Xdir/autoload/loadme.vim')
2016 assert_fails('source Xdir/autoload/loadme.vim', 'E129:')
2017
2018 delete('Xdir', 'rf')
2019enddef
2020
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002021def Test_autoload_name_wring()
2022 var lines =<< trim END
2023 vim9script
2024 def Xscriptname#Func()
2025 enddef
2026 END
2027 writefile(lines, 'Xscriptname.vim')
2028 CheckScriptFailure(lines, 'E1263:')
2029
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00002030 delete('Xscriptname.vim')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002031enddef
2032
Bram Moolenaard041f422022-01-12 19:54:00 +00002033def Test_import_autoload_postponed()
2034 mkdir('Xdir/autoload', 'p')
2035 var save_rtp = &rtp
2036 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2037
2038 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002039 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00002040
2041 g:loaded_postponed = 'true'
2042 export var variable = 'bla'
2043 export def Function(): string
2044 return 'bla'
2045 enddef
2046 END
2047 writefile(lines, 'Xdir/autoload/postponed.vim')
2048
2049 lines =<< trim END
2050 vim9script
2051
2052 import autoload 'postponed.vim'
2053 def Tryit()
2054 echo postponed.variable
2055 echo postponed.Function()
2056 enddef
2057 defcompile
2058 END
2059 CheckScriptSuccess(lines)
2060 assert_false(exists('g:loaded_postponed'))
2061 CheckScriptSuccess(lines + ['Tryit()'])
2062 assert_equal('true', g:loaded_postponed)
2063
2064 unlet g:loaded_postponed
2065 delete('Xdir', 'rf')
2066 &rtp = save_rtp
2067enddef
2068
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002069def Test_import_autoload_override()
2070 mkdir('Xdir/autoload', 'p')
2071 var save_rtp = &rtp
2072 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2073 test_override('autoload', 1)
2074
2075 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002076 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002077
2078 g:loaded_override = 'true'
2079 export var variable = 'bla'
2080 export def Function(): string
2081 return 'bla'
2082 enddef
2083 END
2084 writefile(lines, 'Xdir/autoload/override.vim')
2085
2086 lines =<< trim END
2087 vim9script
2088
2089 import autoload 'override.vim'
2090 assert_equal('true', g:loaded_override)
2091
2092 def Tryit()
2093 echo override.doesNotExist
2094 enddef
2095 defcompile
2096 END
2097 CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
2098
2099 test_override('autoload', 0)
2100 unlet g:loaded_override
2101 delete('Xdir', 'rf')
2102 &rtp = save_rtp
2103enddef
2104
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002105def Test_autoload_mapping()
2106 mkdir('Xdir/autoload', 'p')
2107 var save_rtp = &rtp
2108 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2109
2110 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002111 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002112
2113 g:toggle_loaded = 'yes'
2114
2115 export def Toggle(): string
2116 return ":g:toggle_called = 'yes'\<CR>"
2117 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002118 export def Doit()
2119 g:doit_called = 'yes'
2120 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002121 END
2122 writefile(lines, 'Xdir/autoload/toggle.vim')
2123
2124 lines =<< trim END
2125 vim9script
2126
2127 import autoload 'toggle.vim'
2128
2129 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002130 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2131 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002132 END
2133 CheckScriptSuccess(lines)
2134 assert_false(exists("g:toggle_loaded"))
2135 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002136 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002137
2138 feedkeys("tt", 'xt')
2139 assert_equal('yes', g:toggle_loaded)
2140 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002141 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002142
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002143 feedkeys("xx", 'xt')
2144 assert_equal('yes', g:doit_called)
2145
2146 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2147
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002148 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002149 nunmap xx
2150 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002151 unlet g:toggle_loaded
2152 unlet g:toggle_called
2153 delete('Xdir', 'rf')
2154 &rtp = save_rtp
2155enddef
2156
Bram Moolenaar160aa862022-01-10 21:29:57 +00002157def Test_vim9script_autoload_fails()
2158 var lines =<< trim END
2159 vim9script autoload
2160 var n = 0
2161 END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002162 CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
2163
2164 lines =<< trim END
2165 vim9script noclear noclear
2166 var n = 0
2167 END
2168 CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002169enddef
2170
2171def Test_import_autoload_fails()
2172 var lines =<< trim END
2173 vim9script
2174 import autoload autoload 'prefixed.vim'
2175 END
2176 CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
2177
2178 lines =<< trim END
2179 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002180 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002181 END
2182 CheckScriptFailure(lines, 'E1264:')
Bram Moolenaar1836d612022-01-18 13:14:47 +00002183
2184 lines =<< trim END
2185 vim9script
2186 import autoload '/dir/doesNotExist.vim'
2187 END
2188 CheckScriptFailure(lines, 'E1264:')
2189
2190 lines =<< trim END
2191 vim9script
2192 import autoload 'doesNotExist.vim'
2193 END
2194 CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002195enddef
2196
2197" test disassembling an auto-loaded function starting with "debug"
2198def Test_vim9_autoload_disass()
2199 mkdir('Xdir/autoload', 'p')
2200 var save_rtp = &rtp
2201 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2202
2203 var lines =<< trim END
2204 vim9script
2205 def debugit#test(): string
2206 return 'debug'
2207 enddef
2208 END
2209 writefile(lines, 'Xdir/autoload/debugit.vim')
2210
2211 lines =<< trim END
2212 vim9script
2213 def profileit#test(): string
2214 return 'profile'
2215 enddef
2216 END
2217 writefile(lines, 'Xdir/autoload/profileit.vim')
2218
2219 lines =<< trim END
2220 vim9script
2221 assert_equal('debug', debugit#test())
2222 disass debugit#test
2223 assert_equal('profile', profileit#test())
2224 disass profileit#test
2225 END
2226 CheckScriptSuccess(lines)
2227
2228 delete('Xdir', 'rf')
2229 &rtp = save_rtp
2230enddef
2231
2232" test using a vim9script that is auto-loaded from an autocmd
2233def Test_vim9_aucmd_autoload()
2234 var lines =<< trim END
2235 vim9script
2236 def foo#test()
2237 echomsg getreg('"')
2238 enddef
2239 END
2240
2241 mkdir('Xdir/autoload', 'p')
2242 writefile(lines, 'Xdir/autoload/foo.vim')
2243 var save_rtp = &rtp
2244 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2245 augroup test
2246 autocmd TextYankPost * call foo#test()
2247 augroup END
2248
2249 normal Y
2250
2251 augroup test
2252 autocmd!
2253 augroup END
2254 delete('Xdir', 'rf')
2255 &rtp = save_rtp
2256enddef
2257
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002258" test using a autoloaded file that is case sensitive
2259def Test_vim9_autoload_case_sensitive()
2260 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002261 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002262 export def CaseSensitive(): string
2263 return 'done'
2264 enddef
2265 END
2266
2267 mkdir('Xdir/autoload', 'p')
2268 writefile(lines, 'Xdir/autoload/CaseSensitive.vim')
2269 var save_rtp = &rtp
2270 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2271
2272 lines =<< trim END
2273 vim9script
2274 import autoload 'CaseSensitive.vim'
2275 assert_equal('done', CaseSensitive.CaseSensitive())
2276 END
2277 CheckScriptSuccess(lines)
2278
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002279 if !has('fname_case')
2280 lines =<< trim END
2281 vim9script
2282 import autoload 'CaseSensitive.vim'
2283 import autoload 'casesensitive.vim'
2284 END
2285 CheckScriptFailure(lines, 'E1262:')
2286 endif
2287
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002288 delete('Xdir', 'rf')
2289 &rtp = save_rtp
2290enddef
2291
Bram Moolenaar160aa862022-01-10 21:29:57 +00002292" This was causing a crash because suppress_errthrow wasn't reset.
2293def Test_vim9_autoload_error()
2294 var lines =<< trim END
2295 vim9script
2296 def crash#func()
2297 try
2298 for x in List()
2299 endfor
2300 catch
2301 endtry
2302 g:ok = true
2303 enddef
2304 fu List()
2305 invalid
2306 endfu
2307 try
2308 alsoinvalid
2309 catch /wontmatch/
2310 endtry
2311 END
2312 call mkdir('Xruntime/autoload', 'p')
2313 call writefile(lines, 'Xruntime/autoload/crash.vim')
2314
2315 # run in a separate Vim to avoid the side effects of assert_fails()
2316 lines =<< trim END
2317 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
2318 call crash#func()
2319 call writefile(['ok'], 'Xdidit')
2320 qall!
2321 END
2322 writefile(lines, 'Xscript')
2323 RunVim([], [], '-S Xscript')
2324 assert_equal(['ok'], readfile('Xdidit'))
2325
2326 delete('Xdidit')
2327 delete('Xscript')
2328 delete('Xruntime', 'rf')
2329
2330 lines =<< trim END
2331 vim9script
2332 var foo#bar = 'asdf'
2333 END
2334 CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
2335enddef
2336
Bram Moolenaard8448622022-01-07 21:39:52 +00002337
2338" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker