blob: 6fe40234e436c3084ec7fa5fbe98e6f686f3c739 [file] [log] [blame]
Bram Moolenaard8448622022-01-07 21:39:52 +00001" Test import/export of the Vim9 script language.
Bram Moolenaar160aa862022-01-10 21:29:57 +00002" Also the autoload mechanism.
Bram Moolenaard8448622022-01-07 21:39:52 +00003
4source check.vim
5source term_util.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00006import './vim9.vim' as v9
Bram Moolenaard8448622022-01-07 21:39:52 +00007
8let s:export_script_lines =<< trim END
9 vim9script
10 var name: string = 'bob'
11 def Concat(arg: string): string
12 return name .. arg
13 enddef
14 g:result = Concat('bie')
15 g:localname = name
16
17 export const CONST = 1234
18 export var exported = 9876
19 export var exp_name = 'John'
20 export def Exported(): string
21 return 'Exported'
22 enddef
23 export def ExportedValue(): number
24 return exported
25 enddef
26 export def ExportedInc()
27 exported += 5
28 enddef
29 export final theList = [1]
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000030 export def AddSome(s: string): string
31 return s .. 'some'
32 enddef
33 export var AddRef = AddSome
Bram Moolenaard8448622022-01-07 21:39:52 +000034END
35
Bram Moolenaar62aec932022-01-29 21:45:34 +000036def s:Undo_export_script_lines()
Bram Moolenaard8448622022-01-07 21:39:52 +000037 unlet g:result
38 unlet g:localname
39enddef
40
41def Test_vim9_import_export()
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
Bram Moolenaar68854a82022-01-31 18:59:13 +0000145 var import_shadows_cmdmod_lines =<< trim END
146 vim9script
147 import './Xexport.vim' as vim9
148 vim9.exp_name = 'Shadow'
149 assert_equal('Shadow', vim9.exp_name)
150 END
151 v9.CheckScriptSuccess(import_shadows_cmdmod_lines)
152
Bram Moolenaard8448622022-01-07 21:39:52 +0000153 var line_break_before_dot =<< trim END
154 vim9script
155 import './Xexport.vim' as expo
156 g:exported = expo
157 .exported
158 END
159 writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
160 assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
161 delete('Ximport_lbr_before_dot.vim')
162
163 var line_break_after_dot =<< trim END
164 vim9script
165 import './Xexport.vim' as expo
166 g:exported = expo.
167 exported
168 END
169 writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
170 assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
171 delete('Ximport_lbr_after_dot.vim')
172
173 var import_star_as_lines =<< trim END
174 vim9script
175 import './Xexport.vim' as Export
176 def UseExport()
177 g:exported_def = Export.exported
178 enddef
179 g:exported_script = Export.exported
180 assert_equal(1, exists('Export.exported'))
181 assert_equal(0, exists('Export.notexported'))
182 UseExport()
183 END
184 writefile(import_star_as_lines, 'Ximport.vim')
185 source Ximport.vim
186
187 assert_equal(18, g:exported_def)
188 assert_equal(18, g:exported_script)
189 unlet g:exported_def
190 unlet g:exported_script
191
192 var import_star_as_lines_no_dot =<< trim END
193 vim9script
194 import './Xexport.vim' as Export
195 def Func()
196 var dummy = 1
197 var imported = Export + dummy
198 enddef
199 defcompile
200 END
201 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
202 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
203
204 var import_star_as_lines_dot_space =<< trim END
205 vim9script
206 import './Xexport.vim' as Export
207 def Func()
208 var imported = Export . exported
209 enddef
210 defcompile
211 END
212 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
213 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
214
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000215 writefile(s:export_script_lines, 'Xexport2.vim')
216 var import_as_duplicated =<< trim END
Bram Moolenaard8448622022-01-07 21:39:52 +0000217 vim9script
218 import './Xexport.vim' as expo
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000219 import './Xexport2.vim' as expo
Bram Moolenaard8448622022-01-07 21:39:52 +0000220 END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000221 writefile(import_as_duplicated, 'Ximport.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000222 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000223 delete('Xexport2.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000224
225 var import_star_as_lines_script_no_dot =<< trim END
226 vim9script
227 import './Xexport.vim' as Export
228 g:imported_script = Export exported
229 END
230 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
231 assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
232
233 var import_star_as_lines_script_space_after_dot =<< trim END
234 vim9script
235 import './Xexport.vim' as Export
236 g:imported_script = Export. exported
237 END
238 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
239 assert_fails('source Ximport.vim', 'E1074:')
240
241 var import_star_as_lines_missing_name =<< trim END
242 vim9script
243 import './Xexport.vim' as Export
244 def Func()
245 var imported = Export.
246 enddef
247 defcompile
248 END
249 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
250 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
251
252 var import_star_as_lbr_lines =<< trim END
253 vim9script
254 import './Xexport.vim'
255 as Export
256 def UseExport()
257 g:exported = Export.exported
258 enddef
259 UseExport()
260 END
261 writefile(import_star_as_lbr_lines, 'Ximport.vim')
262 source Ximport.vim
263 assert_equal(18, g:exported)
264 unlet g:exported
265
266 # try to use something that exists but is not exported
267 var import_not_exported_lines =<< trim END
268 vim9script
269 import './Xexport.vim' as expo
270 echo expo.name
271 END
272 writefile(import_not_exported_lines, 'Ximport.vim')
273 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
274
275 # try to import something that is already defined
276 var import_already_defined =<< trim END
277 vim9script
278 var exported = 'something'
279 import './Xexport.vim' as exported
280 END
281 writefile(import_already_defined, 'Ximport.vim')
282 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
283
284 # try changing an imported const
285 var import_assign_to_const =<< trim END
286 vim9script
287 import './Xexport.vim' as expo
288 def Assign()
289 expo.CONST = 987
290 enddef
291 defcompile
292 END
293 writefile(import_assign_to_const, 'Ximport.vim')
294 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
295
296 # try changing an imported final
297 var import_assign_to_final =<< trim END
298 vim9script
299 import './Xexport.vim' as expo
300 def Assign()
301 expo.theList = [2]
302 enddef
303 defcompile
304 END
305 writefile(import_assign_to_final, 'Ximport.vim')
306 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
307
308 var import_no_as_lines =<< trim END
309 vim9script
310 import './Xexport.vim' name
311 END
312 writefile(import_no_as_lines, 'Ximport.vim')
313 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
314
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100315 # trailing starts with "as"
316 var import_bad_as_lines =<< trim END
317 vim9script
318 import './Xexport.vim' asname
319 END
320 writefile(import_no_as_lines, 'Ximport.vim')
321 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
322
Bram Moolenaard8448622022-01-07 21:39:52 +0000323 var import_invalid_string_lines =<< trim END
324 vim9script
325 import Xexport.vim
326 END
327 writefile(import_invalid_string_lines, 'Ximport.vim')
328 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
329
330 var import_wrong_name_lines =<< trim END
331 vim9script
332 import './XnoExport.vim'
333 END
334 writefile(import_wrong_name_lines, 'Ximport.vim')
335 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
336
337 var import_redefining_lines =<< trim END
338 vim9script
339 import './Xexport.vim' as exported
340 var exported = 5
341 END
342 writefile(import_redefining_lines, 'Ximport.vim')
343 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
344
Bram Moolenaar160aa862022-01-10 21:29:57 +0000345 var import_missing_dot_lines =<< trim END
346 vim9script
347 import './Xexport.vim' as expo
348 def Test()
349 expo = 9
350 enddef
351 defcompile
352 END
353 writefile(import_missing_dot_lines, 'Ximport.vim')
354 assert_fails('source Ximport.vim', 'E1258:', '', 1)
355
356 var import_missing_name_lines =<< trim END
357 vim9script
358 import './Xexport.vim' as expo
359 def Test()
360 expo.99 = 9
361 enddef
362 defcompile
363 END
364 writefile(import_missing_name_lines, 'Ximport.vim')
Bram Moolenaar76283822022-01-10 21:39:03 +0000365 assert_fails('source Ximport.vim', 'E1259:', '', 1)
Bram Moolenaar160aa862022-01-10 21:29:57 +0000366
Bram Moolenaard8448622022-01-07 21:39:52 +0000367 var import_assign_wrong_type_lines =<< trim END
368 vim9script
369 import './Xexport.vim' as expo
370 expo.exported = 'xxx'
371 END
372 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
373 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
374
375 var import_assign_const_lines =<< trim END
376 vim9script
377 import './Xexport.vim' as expo
378 expo.CONST = 4321
379 END
380 writefile(import_assign_const_lines, 'Ximport.vim')
381 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
382
383 delete('Ximport.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000384 delete('Xexport.vim')
385
386 # Check that in a Vim9 script 'cpo' is set to the Vim default.
387 # Flags added or removed are also applied to the restored value.
388 set cpo=abcd
389 var lines =<< trim END
390 vim9script
391 g:cpo_in_vim9script = &cpo
392 set cpo+=f
393 set cpo-=c
394 g:cpo_after_vim9script = &cpo
395 END
396 writefile(lines, 'Xvim9_script')
397 source Xvim9_script
398 assert_equal('fabd', &cpo)
399 set cpo&vim
400 assert_equal(&cpo, g:cpo_in_vim9script)
401 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
402 assert_equal(newcpo, g:cpo_after_vim9script)
403
404 delete('Xvim9_script')
405enddef
406
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100407def Test_import_very_long_name()
408 var lines =<< trim END
409 vim9script
410
411 export var verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname = 'asdf'
412 END
413 writefile(lines, 'Xverylong.vim')
414
415 lines =<< trim END
416 vim9script
417 import './Xverylong.vim'
418
419 g:result = Xverylong.verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname
420 END
421 v9.CheckScriptSuccess(lines)
422 assert_equal('asdf', g:result)
423
424 delete('Xverylong.vim')
425 unlet g:result
426enddef
427
Bram Moolenaard8448622022-01-07 21:39:52 +0000428def Test_import_funcref()
429 var lines =<< trim END
430 vim9script
431 export def F(): number
432 return 42
433 enddef
434 export const G = F
435 END
436 writefile(lines, 'Xlib.vim')
437
438 lines =<< trim END
439 vim9script
440 import './Xlib.vim' as lib
441 const Foo = lib.G()
442 assert_equal(42, Foo)
443
444 def DoTest()
445 const Goo = lib.G()
446 assert_equal(42, Goo)
447 enddef
448 DoTest()
449 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000450 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000451
452 delete('Xlib.vim')
453enddef
454
Bram Moolenaar5ab30012022-10-07 17:26:22 +0100455def Test_export_closure()
456 # tests that the closure in block can be compiled, not the import part
457 var lines =<< trim END
458 vim9script
459 {
460 var foo = 42
461 export def Bar(): number
462 return foo
463 enddef
464 }
465 assert_equal(42, Bar())
466 END
467 v9.CheckScriptSuccess(lines)
468enddef
469
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000470def Test_import_duplicate_function()
471 # Function Hover() exists in both scripts, partial should refer to the right
472 # one.
473 var lines =<< trim END
474 vim9script
475
476 def Hover(d: dict<any>): string
477 return 'found it'
478 enddef
479
480 export def NewLspServer(): dict<any>
481 var d: dict<any> = {}
482 d->extend({hover: function('Hover', [d])})
483 return d
484 enddef
485
486 NewLspServer()
487 END
488 writefile(lines, 'Xserver.vim')
489
490 lines =<< trim END
491 vim9script
492
493 import './Xserver.vim' as server
494
495 export def Hover()
496 enddef
497
498 def AddServer()
499 var d: dict<any> = server.NewLspServer()
500 assert_equal('found it', d.hover())
501 enddef
502 AddServer()
503 END
504 v9.CheckScriptSuccess(lines)
505
506 delete('Xserver.vim')
507enddef
508
509
Bram Moolenaard8448622022-01-07 21:39:52 +0000510def Test_import_fails()
511 writefile([], 'Xfoo.vim')
512 var lines =<< trim END
513 import './Xfoo.vim' as foo
514 foo = 'bar'
515 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000516 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
Bram Moolenaard8448622022-01-07 21:39:52 +0000517 lines =<< trim END
518 vim9script
519 import './Xfoo.vim' as foo
520 var that = foo
521 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000522 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000523 lines =<< trim END
524 vim9script
525 import './Xfoo.vim' as foo
526 var that: any
527 that += foo
528 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000529 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000530 lines =<< trim END
531 vim9script
532 import './Xfoo.vim' as foo
533 foo += 9
534 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000535 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaard8448622022-01-07 21:39:52 +0000536
537 lines =<< trim END
538 vim9script
539 import './Xfoo.vim' as 9foo
540 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000541 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000542 lines =<< trim END
543 vim9script
544 import './Xfoo.vim' as the#foo
545 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000546 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000547 lines =<< trim END
548 vim9script
549 import './Xfoo.vim' as g:foo
550 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000551 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000552
Bram Moolenaard8448622022-01-07 21:39:52 +0000553 lines =<< trim END
554 vim9script
555 def TheFunc()
556 echo 'the func'
557 enddef
558 export var Ref = TheFunc
559 END
560 writefile([], 'Xthat.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000561
Bram Moolenaard8448622022-01-07 21:39:52 +0000562 lines =<< trim END
563 import './Xthat.vim' as That
564 That()
565 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000566 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000567
568 lines =<< trim END
Bram Moolenaar937610b2022-01-19 17:21:29 +0000569 vim9script
570 import './Xthat.vim' as That
571 def Func()
572 echo That()
573 enddef
574 Func()
575 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000576 v9.CheckScriptFailure(lines, 'E1236: Cannot use That itself')
Bram Moolenaar937610b2022-01-19 17:21:29 +0000577
578 lines =<< trim END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000579 import './Xthat.vim' as one
580 import './Xthat.vim' as two
581 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000582 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000583
584 delete('Xthat.vim')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000585
586 lines =<< trim END
587 vim9script
588 export var item = 'hello'
589 import './Xyourself.vim'
590 END
591 writefile(lines, 'Xyourself.vim')
592 assert_fails('source Xyourself.vim', 'E1088:')
593 delete('Xyourself.vim')
594
Bram Moolenaard8448622022-01-07 21:39:52 +0000595 mkdir('Ximport')
596
597 writefile(['vim9script'], 'Ximport/.vim')
598 lines =<< trim END
599 vim9script
600 import './Ximport/.vim'
601 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000602 v9.CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
Bram Moolenaard8448622022-01-07 21:39:52 +0000603 lines =<< trim END
604 vim9script
605 import './Ximport/.vim' as vim
606 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000607 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000608
609 writefile(['vim9script'], 'Ximport/.vimrc')
610 lines =<< trim END
611 vim9script
612 import './Ximport/.vimrc'
613 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000614 v9.CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000615 lines =<< trim END
616 vim9script
617 import './Ximport/.vimrc' as vimrc
618 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000619 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000620
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100621 new
622 setline(1, ['vim9script', 'import "" as abc'])
623 assert_fails('source', 'E1071: Invalid string for :import: "" as abc')
624 setline(2, 'import [] as abc')
625 assert_fails('source', 'E1071: Invalid string for :import: [] as abc')
626 setline(2, 'import test_null_string() as abc')
627 assert_fails('source', 'E1071: Invalid string for :import: test_null_string() as abc')
628 bw!
629 call writefile(['vim9script', "import './Xfoo.vim' ask expo"], 'Xbar.vim')
630 assert_fails('source Xbar.vim', 'E488: Trailing characters: ask expo')
631 writefile([], 'Xtemp')
632 call writefile(['vim9script', "import './Xtemp'"], 'Xbar.vim')
633 assert_fails('source Xbar.vim', 'E1257: Imported script must use "as" or end in .vim: Xtemp')
634 delete('Xtemp')
635 call writefile(['vim9script', "import './Xfoo.vim' as abc | foobar"], 'Xbar.vim')
636 assert_fails('source Xbar.vim', 'E492: Not an editor command: foobar')
637 call delete('Xbar.vim')
638
Bram Moolenaard8448622022-01-07 21:39:52 +0000639 delete('Ximport', 'rf')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100640 delete('Xfoo.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000641enddef
642
643func g:Trigger()
644 source Ximport.vim
645 return "echo 'yes'\<CR>"
646endfunc
647
648def Test_import_export_expr_map()
649 # check that :import and :export work when buffer is locked
650 var export_lines =<< trim END
651 vim9script
652 export def That(): string
653 return 'yes'
654 enddef
655 END
656 writefile(export_lines, 'Xexport_that.vim')
657
658 var import_lines =<< trim END
659 vim9script
660 import './Xexport_that.vim' as that
661 assert_equal('yes', that.That())
662 END
663 writefile(import_lines, 'Ximport.vim')
664
665 nnoremap <expr> trigger g:Trigger()
666 feedkeys('trigger', "xt")
667
668 delete('Xexport_that.vim')
669 delete('Ximport.vim')
670 nunmap trigger
671enddef
672
673def Test_import_in_filetype()
674 # check that :import works when the buffer is locked
675 mkdir('ftplugin', 'p')
676 var export_lines =<< trim END
677 vim9script
678 export var That = 'yes'
679 END
680 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
681
682 var import_lines =<< trim END
683 vim9script
684 import './Xexport_ft.vim' as ft
685 assert_equal('yes', ft.That)
686 g:did_load_mytpe = 1
687 END
688 writefile(import_lines, 'ftplugin/qf.vim')
689
690 var save_rtp = &rtp
691 &rtp = getcwd() .. ',' .. &rtp
692
693 filetype plugin on
694 copen
695 assert_equal(1, g:did_load_mytpe)
696
697 quit!
698 delete('Xexport_ft.vim')
699 delete('ftplugin', 'rf')
700 &rtp = save_rtp
701enddef
702
703def Test_use_import_in_mapping()
704 var lines =<< trim END
705 vim9script
Bram Moolenaar89445512022-04-14 12:58:23 +0100706 export def Funcx(nr: number)
707 g:result = nr
Bram Moolenaard8448622022-01-07 21:39:52 +0000708 enddef
709 END
710 writefile(lines, 'XsomeExport.vim')
711 lines =<< trim END
712 vim9script
713 import './XsomeExport.vim' as some
714 var Funcy = some.Funcx
Bram Moolenaar89445512022-04-14 12:58:23 +0100715 nnoremap <F3> :call <sid>Funcy(42)<cr>
716 nnoremap <F4> :call <sid>some.Funcx(44)<cr>
Bram Moolenaard8448622022-01-07 21:39:52 +0000717 END
718 writefile(lines, 'Xmapscript.vim')
719
720 source Xmapscript.vim
721 feedkeys("\<F3>", "xt")
722 assert_equal(42, g:result)
Bram Moolenaar89445512022-04-14 12:58:23 +0100723 feedkeys("\<F4>", "xt")
724 assert_equal(44, g:result)
Bram Moolenaard8448622022-01-07 21:39:52 +0000725
726 unlet g:result
727 delete('XsomeExport.vim')
728 delete('Xmapscript.vim')
729 nunmap <F3>
Bram Moolenaar89445512022-04-14 12:58:23 +0100730 nunmap <F4>
731enddef
732
Bram Moolenaar648dd882022-04-14 21:36:15 +0100733def Test_use_relative_autoload_import_in_mapping()
Bram Moolenaar89445512022-04-14 12:58:23 +0100734 var lines =<< trim END
735 vim9script
736 export def Func()
737 g:result = 42
738 enddef
739 END
Bram Moolenaar648dd882022-04-14 21:36:15 +0100740 writefile(lines, 'XrelautoloadExport.vim')
Bram Moolenaar89445512022-04-14 12:58:23 +0100741 lines =<< trim END
742 vim9script
Bram Moolenaar648dd882022-04-14 21:36:15 +0100743 import autoload './XrelautoloadExport.vim' as some
Bram Moolenaar89445512022-04-14 12:58:23 +0100744 nnoremap <F3> :call <SID>some.Func()<CR>
745 END
746 writefile(lines, 'Xmapscript.vim')
747
748 source Xmapscript.vim
Bram Moolenaar648dd882022-04-14 21:36:15 +0100749 assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100750 var l = getscriptinfo()
751 assert_match('XrelautoloadExport.vim$', l[-1].name)
752 assert_true(l[-1].autoload)
Bram Moolenaar89445512022-04-14 12:58:23 +0100753 feedkeys("\<F3>", "xt")
754 assert_equal(42, g:result)
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100755 l = getscriptinfo({name: 'XrelautoloadExport'})
756 assert_true(len(l) == 1)
757 assert_match('XrelautoloadExport.vim$', l[0].name)
758 assert_false(l[0].autoload)
Yegappan Lakshmanan2f892d82022-08-28 18:52:10 +0100759 assert_equal(999999, l[0].version)
Bram Moolenaar89445512022-04-14 12:58:23 +0100760
761 unlet g:result
Bram Moolenaar648dd882022-04-14 21:36:15 +0100762 delete('XrelautoloadExport.vim')
Bram Moolenaar89445512022-04-14 12:58:23 +0100763 delete('Xmapscript.vim')
764 nunmap <F3>
Bram Moolenaard8448622022-01-07 21:39:52 +0000765enddef
766
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100767def Test_autoload_import_var()
768 # variable name starts with "autoload"
769 var lines =<< trim END
770 vim9script
771 var autoloaded = "Xtest.vim"
772 import autoloaded
773 END
774 v9.CheckScriptFailure(lines, 'E1053: Could not import "Xtest.vim')
775enddef
776
Bram Moolenaar648dd882022-04-14 21:36:15 +0100777def Test_use_autoload_import_in_mapping()
778 var lines =<< trim END
779 vim9script
780 export def Func()
781 g:result = 49
782 enddef
783 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100784 mkdir('Ximpdir/autoload', 'p')
785 writefile(lines, 'Ximpdir/autoload/XautoloadExport.vim')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100786 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100787 exe 'set rtp^=' .. getcwd() .. '/Ximpdir'
Bram Moolenaar648dd882022-04-14 21:36:15 +0100788
789 lines =<< trim END
790 vim9script
791 import autoload 'XautoloadExport.vim' as some
792 nnoremap <F3> :call <SID>some.Func()<CR>
793 END
794 writefile(lines, 'Xmapscript.vim')
795
796 source Xmapscript.vim
797 assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
798 feedkeys("\<F3>", "xt")
799 assert_equal(49, g:result)
800
801 unlet g:result
802 delete('Xmapscript.vim')
803 nunmap <F3>
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100804 delete('Ximpdir', 'rf')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100805 &rtp = save_rtp
806enddef
807
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000808def Test_use_import_in_command_completion()
Bram Moolenaar15d16352022-01-17 20:09:08 +0000809 var lines =<< trim END
810 vim9script
811 export def Complete(..._): list<string>
812 return ['abcd']
813 enddef
814 END
815 writefile(lines, 'Xscript.vim')
816
817 lines =<< trim END
818 vim9script
819 import './Xscript.vim'
820
821 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
822 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
823 assert_equal('#Cmd abcd', @:)
824 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000825 v9.CheckScriptSuccess(lines)
Bram Moolenaar15d16352022-01-17 20:09:08 +0000826
827 delcommand Cmd
828 delete('Xscript.vim')
829enddef
830
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100831def Test_use_import_with_funcref_in_command_completion()
832 var lines =<< trim END
833 vim9script
834 export def Complete(..._): list<string>
835 return ['abcd']
836 enddef
837 END
838 writefile(lines, 'Xscript.vim')
839
840 lines =<< trim END
841 vim9script
842 import './Xscript.vim'
843
844 var Ref = Xscript.Complete
845 exe "command -nargs=1 -complete=customlist," .. expand('<SID>') .. "Ref Cmd echo 'ok'"
846 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
847 assert_equal('#Cmd abcd', @:)
848 END
849 v9.CheckScriptSuccess(lines)
850
851 delcommand Cmd
852 delete('Xscript.vim')
853enddef
854
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000855def Test_use_autoload_import_in_insert_completion()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100856 mkdir('Xinsdir/autoload', 'p')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000857 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100858 exe 'set rtp^=' .. getcwd() .. '/Xinsdir'
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000859
860 var lines =<< trim END
861 vim9script
862 export def ThesaurusFunc(findbase: bool, _): any
863 if findbase
864 return 1
865 endif
866 return [
867 'check',
868 'experiment',
869 'test',
870 'verification'
871 ]
872 enddef
873 g:completion_loaded = 'yes'
874 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100875 writefile(lines, 'Xinsdir/autoload/completion.vim')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000876
877 new
878 lines =<< trim END
879 vim9script
880 g:completion_loaded = 'no'
881 import autoload 'completion.vim'
882 set thesaurusfunc=completion.ThesaurusFunc
883 assert_equal('no', g:completion_loaded)
884 feedkeys("i\<C-X>\<C-T>\<C-N>\<Esc>", 'xt')
885 assert_equal('experiment', getline(1))
886 assert_equal('yes', g:completion_loaded)
887 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000888 v9.CheckScriptSuccess(lines)
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000889
890 set thesaurusfunc=
891 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100892 delete('Xinsdir', 'rf')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000893 &rtp = save_rtp
894enddef
895
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000896def Test_use_autoload_import_partial_in_opfunc()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100897 mkdir('Xpartdir/autoload', 'p')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000898 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100899 exe 'set rtp^=' .. getcwd() .. '/Xpartdir'
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000900
901 var lines =<< trim END
902 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100903 export def Opfunc1(..._)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000904 g:opfunc_called = 'yes'
905 enddef
906 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100907 writefile(lines, 'Xpartdir/autoload/opfunc.vim')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000908
909 new
910 lines =<< trim END
911 vim9script
912 import autoload 'opfunc.vim'
913 nnoremap <expr> <F3> TheFunc()
914 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100915 &operatorfunc = function('opfunc.Opfunc1', [0])
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000916 return 'g@'
917 enddef
918 feedkeys("\<F3>l", 'xt')
919 assert_equal('yes', g:opfunc_called)
920 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000921 v9.CheckScriptSuccess(lines)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000922
923 set opfunc=
924 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100925 delete('Xpartdir', 'rf')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000926 nunmap <F3>
927 &rtp = save_rtp
928enddef
929
930def Test_set_opfunc_to_autoload_func_directly()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100931 mkdir('Xdirdir/autoload', 'p')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000932 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100933 exe 'set rtp^=' .. getcwd() .. '/Xdirdir'
Bram Moolenaar06b77222022-01-25 15:51:56 +0000934
935 var lines =<< trim END
936 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100937 export def Opfunc2(..._)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000938 g:opfunc_called = 'yes'
939 enddef
940 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100941 writefile(lines, 'Xdirdir/autoload/opfunc.vim')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000942
943 new
944 lines =<< trim END
945 vim9script
946 import autoload 'opfunc.vim'
947 nnoremap <expr> <F3> TheFunc()
948 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100949 &operatorfunc = opfunc.Opfunc2
Bram Moolenaar06b77222022-01-25 15:51:56 +0000950 return 'g@'
951 enddef
952 feedkeys("\<F3>l", 'xt')
953 assert_equal('yes', g:opfunc_called)
954 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000955 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000956
957 set opfunc=
958 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100959 delete('Xdirdir', 'rf')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000960 nunmap <F3>
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000961 &rtp = save_rtp
962enddef
963
Bram Moolenaare70dd112022-01-21 16:31:11 +0000964def Test_use_autoload_import_in_fold_expression()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100965 mkdir('Xfolddir/autoload', 'p')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000966 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100967 exe 'set rtp^=' .. getcwd() .. '/Xfolddir'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000968
969 var lines =<< trim END
970 vim9script
971 export def Expr(): string
972 return getline(v:lnum) =~ '^#' ? '>1' : '1'
973 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000974 export def Text(): string
975 return 'fold text'
976 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000977 g:fold_loaded = 'yes'
978 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100979 writefile(lines, 'Xfolddir/autoload/fold.vim')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000980
981 lines =<< trim END
982 vim9script
983 import autoload 'fold.vim'
984 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000985 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000986 &foldmethod = 'expr'
987 &debug = 'throw'
988 END
989 new
990 setline(1, ['# one', 'text', '# two', 'text'])
991 g:fold_loaded = 'no'
Bram Moolenaar62aec932022-01-29 21:45:34 +0000992 v9.CheckScriptSuccess(lines)
Bram Moolenaare70dd112022-01-21 16:31:11 +0000993 assert_equal('no', g:fold_loaded)
994 redraw
995 assert_equal('yes', g:fold_loaded)
996
997 # Check that script context of 'foldexpr' is copied to another buffer.
998 edit! otherfile
999 redraw
1000
Bram Moolenaar9530b582022-01-22 13:39:08 +00001001 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +00001002 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001003 delete('Xfolddir', 'rf')
Bram Moolenaare70dd112022-01-21 16:31:11 +00001004 &rtp = save_rtp
1005enddef
1006
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001007def Test_autoload_import_relative()
1008 var lines =<< trim END
1009 vim9script
1010
1011 g:loaded = 'yes'
1012 export def RelFunc(): string
1013 return 'relfunc'
1014 enddef
1015 def NotExported()
1016 echo 'not'
1017 enddef
1018
1019 export var someText = 'some text'
1020 var notexp = 'bad'
1021 END
1022 writefile(lines, 'XimportRel.vim')
1023 writefile(lines, 'XimportRel2.vim')
1024 writefile(lines, 'XimportRel3.vim')
Bram Moolenaar10611952022-04-03 21:11:34 +01001025 writefile(lines, 'XimportRel4.vim')
1026 writefile(lines, 'XimportRel5.vim')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001027
1028 lines =<< trim END
1029 vim9script
1030 g:loaded = 'no'
1031 import autoload './XimportRel.vim'
1032 assert_equal('no', g:loaded)
1033
1034 def AFunc(): string
1035 var res = ''
1036 res ..= XimportRel.RelFunc()
1037 res ..= '/'
1038 res ..= XimportRel.someText
1039 XimportRel.someText = 'from AFunc'
1040 return res
1041 enddef
1042 # script not loaded when compiling
1043 defcompile
1044 assert_equal('no', g:loaded)
1045
1046 assert_equal('relfunc/some text', AFunc())
1047 assert_equal('yes', g:loaded)
1048 unlet g:loaded
1049
1050 assert_equal('from AFunc', XimportRel.someText)
1051 XimportRel.someText = 'from script'
1052 assert_equal('from script', XimportRel.someText)
1053 END
1054 v9.CheckScriptSuccess(lines)
1055
1056 lines =<< trim END
1057 vim9script
1058 import autoload './XimportRel.vim'
1059 echo XimportRel.NotExported()
1060 END
1061 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 3)
1062
1063 lines =<< trim END
1064 vim9script
1065 import autoload './XimportRel.vim'
1066 echo XimportRel.notexp
1067 END
1068 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1069
1070 lines =<< trim END
1071 vim9script
1072 import autoload './XimportRel.vim'
1073 XimportRel.notexp = 'bad'
1074 END
1075 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1076
1077 lines =<< trim END
1078 vim9script
1079 import autoload './XimportRel.vim'
1080 def Func()
1081 echo XimportRel.NotExported()
1082 enddef
1083 Func()
1084 END
1085 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 1)
1086
1087 lines =<< trim END
1088 vim9script
1089 import autoload './XimportRel.vim'
1090 def Func()
1091 echo XimportRel.notexp
1092 enddef
1093 Func()
1094 END
1095 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1096
Bram Moolenaar10611952022-04-03 21:11:34 +01001097 # Same, script not imported before
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001098 lines =<< trim END
1099 vim9script
Bram Moolenaar10611952022-04-03 21:11:34 +01001100 import autoload './XimportRel4.vim'
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001101 def Func()
Bram Moolenaar10611952022-04-03 21:11:34 +01001102 echo XimportRel4.notexp
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001103 enddef
1104 Func()
1105 END
1106 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1107
Bram Moolenaar10611952022-04-03 21:11:34 +01001108 # does not fail if the script wasn't loaded yet and only compiling
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001109 g:loaded = 'no'
1110 lines =<< trim END
1111 vim9script
1112 import autoload './XimportRel2.vim'
1113 def Func()
1114 echo XimportRel2.notexp
1115 enddef
1116 defcompile
1117 END
1118 v9.CheckScriptSuccess(lines)
1119 assert_equal('no', g:loaded)
1120
Bram Moolenaar10611952022-04-03 21:11:34 +01001121 lines =<< trim END
1122 vim9script
1123 import autoload './XimportRel.vim'
1124 def Func()
1125 XimportRel.notexp = 'bad'
1126 enddef
1127 Func()
1128 END
1129 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1130
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001131 # fails with a not loaded import
1132 lines =<< trim END
1133 vim9script
1134 import autoload './XimportRel3.vim'
1135 def Func()
1136 XimportRel3.notexp = 'bad'
1137 enddef
1138 Func()
1139 END
1140 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1141 assert_equal('yes', g:loaded)
1142 unlet g:loaded
1143
Bram Moolenaar10611952022-04-03 21:11:34 +01001144 lines =<< trim END
1145 vim9script
1146 import autoload './XimportRel5.vim'
1147 def Func()
1148 XimportRel5.nosuchvar = 'bad'
1149 enddef
1150 Func()
1151 END
1152 v9.CheckScriptFailure(lines, 'E121: Undefined variable: nosuchvar', 1)
1153 unlet g:loaded
1154
1155 # nasty: delete script after compiling function
1156 writefile(['vim9script'], 'XimportRelDel.vim')
1157 lines =<< trim END
1158 vim9script
1159
1160 import autoload './XimportRelDel.vim'
1161 def DoIt()
1162 echo XimportRelDel.var
1163 enddef
1164 defcompile
1165 delete('XimportRelDel.vim')
1166 DoIt()
1167 END
Bram Moolenaar242c1522022-04-03 21:52:51 +01001168 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaar10611952022-04-03 21:11:34 +01001169
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001170 delete('XimportRel.vim')
1171 delete('XimportRel2.vim')
1172 delete('XimportRel3.vim')
Bram Moolenaar10611952022-04-03 21:11:34 +01001173 delete('XimportRel4.vim')
1174 delete('XimportRel5.vim')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001175enddef
1176
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001177def Test_autoload_import_relative_autoload_dir()
1178 mkdir('autoload', 'p')
1179 var lines =<< trim END
1180 vim9script
1181 export def Bar()
1182 g:called_bar = 'yes'
1183 enddef
1184 END
1185 writefile(lines, 'autoload/script.vim')
1186
1187 lines =<< trim END
1188 vim9script
1189 import autoload './autoload/script.vim'
1190 def Foo()
1191 script.Bar()
1192 enddef
1193 Foo()
1194 assert_equal('yes', g:called_bar)
1195 END
1196 v9.CheckScriptSuccess(lines)
1197
1198 unlet g:called_bar
1199 delete('autoload', 'rf')
1200enddef
1201
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001202def Test_autoload_import_deleted()
1203 var lines =<< trim END
1204 vim9script
1205 export const FOO = 1
1206 END
1207 writefile(lines, 'Xa.vim')
1208
1209 lines =<< trim END
1210 vim9script
1211 import autoload './Xa.vim'
1212
1213 delete('Xa.vim')
1214 var x = Xa.FOO
1215 END
1216 v9.CheckScriptFailure(lines, 'E484:')
1217
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001218 delete('Xa.vim')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001219enddef
1220
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01001221def Test_autoload_import_using_const()
1222 mkdir('Xdir/autoload', 'pR')
1223 var lines =<< trim END
1224 vim9script
1225 export const FOO = 42
1226 echomsg FOO
1227 END
1228 writefile(lines, 'Xdir/autoload/exp.vim')
1229
1230 var save_rtp = &rtp
1231 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1232 lines =<< trim END
1233 vim9script
1234 import autoload 'exp.vim'
1235 assert_equal(42, exp.FOO)
1236 END
1237 v9.CheckScriptSuccess(lines)
1238 &rtp = save_rtp
1239enddef
1240
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001241func Test_import_in_diffexpr()
1242 CheckExecutable diff
1243
1244 call Run_Test_import_in_diffexpr()
1245endfunc
1246
1247def Run_Test_import_in_diffexpr()
1248 var lines =<< trim END
1249 vim9script
1250
1251 export def DiffExpr()
1252 # Prepend some text to check diff type detection
1253 writefile(['warning', ' message'], v:fname_out)
1254 silent exe '!diff ' .. v:fname_in .. ' '
1255 .. v:fname_new .. '>>' .. v:fname_out
1256 enddef
1257 END
1258 writefile(lines, 'Xdiffexpr')
1259
1260 lines =<< trim END
1261 vim9script
1262 import './Xdiffexpr' as diff
1263
1264 set diffexpr=diff.DiffExpr()
1265 set diffopt=foldcolumn:0
1266 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001267 v9.CheckScriptSuccess(lines)
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001268
1269 enew!
1270 call setline(1, ['one', 'two', 'three'])
1271 diffthis
1272
1273 botright vert new
1274 call setline(1, ['one', 'two', 'three.'])
1275 diffthis
1276 # we only check if this does not cause errors
1277 redraw
1278
1279 diffoff!
Bram Moolenaar50761872022-06-26 18:01:00 +01001280 set diffexpr=
1281 set diffopt&
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001282 bwipe!
1283 bwipe!
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00001284 delete('Xdiffexpr')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001285enddef
1286
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001287def Test_import_in_patchexpr()
1288 var lines =<< trim END
1289 vim9script
1290 export def TPatch()
1291 call writefile(['output file'], v:fname_out)
1292 enddef
1293 END
1294 writefile(lines, 'Xpatchexpr')
1295
1296 lines =<< trim END
1297 vim9script
1298 import './Xpatchexpr' as patch
1299 set patchexpr=patch.TPatch()
1300 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001301 v9.CheckScriptSuccess(lines)
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001302
1303 call writefile(['input file'], 'Xinput')
1304 call writefile(['diff file'], 'Xdiff')
1305 :%bwipe!
1306 edit Xinput
1307 diffpatch Xdiff
1308 call assert_equal('output file', getline(1))
1309
1310 call delete('Xinput')
1311 call delete('Xdiff')
1312 call delete('Xpatchexpr')
1313 set patchexpr&
1314 :%bwipe!
1315enddef
1316
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001317def Test_import_in_formatexpr()
1318 var lines =<< trim END
1319 vim9script
1320 export def MyFormatExpr(): number
1321 g:did_format = 'yes'
1322 return 0
1323 enddef
1324 END
1325 writefile(lines, 'Xformatter')
1326
1327 lines =<< trim END
1328 vim9script
1329 import './Xformatter' as format
1330 set formatexpr=format.MyFormatExpr()
1331 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001332 v9.CheckScriptSuccess(lines)
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001333
1334 new
1335 setline(1, ['a', 'b', 'c'])
1336 normal gqG
1337 assert_equal('yes', g:did_format)
1338
1339 bwipe!
1340 delete('Xformatter')
1341 unlet g:did_format
1342 set formatexpr=
1343enddef
1344
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001345def Test_import_in_includeexpr()
1346 writefile(['found it'], 'Xthisfile')
1347 new
1348
1349 var lines =<< trim END
1350 vim9script
1351 export def DoSub(): string
1352 return substitute(v:fname, 'that', 'this', '')
1353 enddef
1354 END
1355 writefile(lines, 'Xinclude.vim')
1356
1357 lines =<< trim END
1358 vim9script
1359 import './Xinclude.vim'
1360 set includeexpr=Xinclude.DoSub()
1361 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001362 v9.CheckScriptSuccess(lines)
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001363
1364 setline(1, ['Xthatfile'])
1365 exe "normal \<C-W>f"
1366 assert_equal('Xthisfile', expand('%'))
1367
1368 bwipe!
1369 bwipe!
1370 set includeexpr=
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00001371 delete('Xinclude.vim')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001372 delete('Xthisfile')
1373enddef
1374
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001375def Test_import_in_indentexpr()
1376 var lines =<< trim END
1377 vim9script
1378 export def GetIndent(): number
1379 return 5
1380 enddef
1381 END
1382 writefile(lines, 'Xindenter')
1383
1384 lines =<< trim END
1385 vim9script
1386 import './Xindenter' as indent
1387 set indentexpr=indent.GetIndent()
1388 set debug=throw
1389 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001390 v9.CheckScriptSuccess(lines)
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001391
1392 new
1393 setline(1, 'hello')
1394 normal ==
1395 assert_equal(' hello', getline(1))
1396
1397 bwipe!
1398 set indentexpr= debug=
1399 delete('Xindenter')
1400enddef
1401
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001402func Test_import_in_printexpr()
1403 CheckFeature postscript
1404 call Run_Test_import_in_printexpr()
1405endfunc
1406
1407def Run_Test_import_in_printexpr()
1408 var lines =<< trim END
1409 vim9script
1410 export def PrintFile(): bool
1411 g:printed = 'yes'
1412 delete('v:fname_in')
1413 return false
1414 enddef
1415 END
1416 writefile(lines, 'Xprint.vim')
1417
1418 lines =<< trim END
1419 vim9script
1420 import './Xprint.vim'
1421 set printexpr=Xprint.PrintFile()
1422 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001423 v9.CheckScriptSuccess(lines)
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001424
1425 help
1426 hardcopy dummy args
1427 assert_equal('yes', g:printed)
1428
1429 delete('Xprint.vim')
1430 set printexpr=
1431enddef
1432
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001433def Test_import_in_charconvert()
1434 var lines =<< trim END
1435 vim9script
1436 export def MakeUpper(): bool
1437 var data = readfile(v:fname_in)
1438 map(data, 'toupper(v:val)')
1439 writefile(data, v:fname_out)
1440 return false # success
1441 enddef
1442 END
1443 writefile(lines, 'Xconvert.vim')
1444
1445 lines =<< trim END
1446 vim9script
1447 import './Xconvert.vim' as conv
1448 set charconvert=conv.MakeUpper()
1449 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001450 v9.CheckScriptSuccess(lines)
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001451
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001452 writefile(['one', 'two'], 'Xiicfile')
1453 new Xiicfile
1454 write ++enc=ucase Xiicfile1
1455 assert_equal(['ONE', 'TWO'], readfile('Xiicfile1'))
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001456
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001457 delete('Xiicfile')
1458 delete('Xiicfile1')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001459 delete('Xconvert.vim')
1460 bwipe!
1461 set charconvert&
1462enddef
1463
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001464func Test_import_in_spellsuggest_expr()
1465 CheckFeature spell
1466 call Run_Test_import_in_spellsuggest_expr()
1467endfunc
1468
1469def Run_Test_import_in_spellsuggest_expr()
1470 var lines =<< trim END
1471 vim9script
1472 export def MySuggest(): list<any>
1473 return [['Fox', 8], ['Fop', 9]]
1474 enddef
1475 END
1476 writefile(lines, 'Xsuggest.vim')
1477
1478 lines =<< trim END
1479 vim9script
1480 import './Xsuggest.vim' as sugg
1481 set spell spellsuggest=expr:sugg.MySuggest()
1482 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001483 v9.CheckScriptSuccess(lines)
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001484
1485 set verbose=1 # report errors
1486 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
1487
1488 delete('Xsuggest.vim')
1489 set nospell spellsuggest& verbose=0
1490enddef
1491
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001492def Test_import_in_lambda_method()
1493 var lines =<< trim END
1494 vim9script
1495 export def Retarg(e: any): any
1496 return e
1497 enddef
1498 END
1499 writefile(lines, 'XexportRetarg.vim')
1500 lines =<< trim END
1501 vim9script
1502 import './XexportRetarg.vim'
1503 def Lambda(): string
1504 var F = (x) => x->XexportRetarg.Retarg()
1505 return F('arg')
1506 enddef
1507 assert_equal('arg', Lambda())
1508 END
1509 v9.CheckScriptSuccess(lines)
1510
1511 delete('XexportRetarg.vim')
1512enddef
1513
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001514def Test_export_shadows_global_function()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001515 mkdir('Xglobdir/autoload', 'p')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001516 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001517 exe 'set rtp^=' .. getcwd() .. '/Xglobdir'
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001518
1519 var lines =<< trim END
1520 vim9script
1521 export def Shadow(): string
1522 return 'Shadow()'
1523 enddef
1524 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001525 writefile(lines, 'Xglobdir/autoload/shadow.vim')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001526
1527 lines =<< trim END
1528 vim9script
1529
1530 def g:Shadow(): string
1531 return 'global'
1532 enddef
1533
1534 import autoload 'shadow.vim'
1535 assert_equal('Shadow()', shadow.Shadow())
1536 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001537 v9.CheckScriptSuccess(lines)
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001538
1539 delfunc g:Shadow
1540 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001541 delete('Xglobdir', 'rf')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001542 &rtp = save_rtp
1543enddef
1544
Bram Moolenaard8448622022-01-07 21:39:52 +00001545def Test_export_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001546 v9.CheckScriptFailure(['export var some = 123'], 'E1042:')
1547 v9.CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1548 v9.CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01001549 v9.CheckScriptFailure(['vim9script', 'export function /a1b2c3'], 'E1044:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001550
Bram Moolenaar5ab30012022-10-07 17:26:22 +01001551 assert_fails('export echo 1', 'E1043:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001552enddef
1553
1554func Test_import_fails_without_script()
1555 CheckRunVimInTerminal
1556
1557 " call indirectly to avoid compilation error for missing functions
1558 call Run_Test_import_fails_on_command_line()
1559endfunc
1560
1561def Run_Test_import_fails_on_command_line()
1562 var export =<< trim END
1563 vim9script
1564 export def Foo(): number
1565 return 0
1566 enddef
1567 END
1568 writefile(export, 'XexportCmd.vim')
1569
Bram Moolenaar62aec932022-01-29 21:45:34 +00001570 var buf = g:RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaard8448622022-01-07 21:39:52 +00001571 rows: 6, wait_for_ruler: 0})
Bram Moolenaar62aec932022-01-29 21:45:34 +00001572 g:WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaard8448622022-01-07 21:39:52 +00001573
1574 delete('XexportCmd.vim')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001575 g:StopVimInTerminal(buf)
Bram Moolenaard8448622022-01-07 21:39:52 +00001576enddef
1577
1578def Test_vim9_reload_noclear()
1579 var lines =<< trim END
1580 vim9script
1581 export var exported = 'thexport'
1582
1583 export def TheFunc(x = 0)
1584 enddef
1585 END
1586 writefile(lines, 'XExportReload')
1587 lines =<< trim END
1588 vim9script noclear
1589 g:loadCount += 1
Bram Moolenaara749a422022-02-12 19:52:25 +00001590 var reloaded = 'init'
Bram Moolenaard8448622022-01-07 21:39:52 +00001591 import './XExportReload' as exp
1592
1593 def Again(): string
1594 return 'again'
1595 enddef
1596
1597 exp.TheFunc()
1598
Bram Moolenaara749a422022-02-12 19:52:25 +00001599 if exists('loaded') | finish | endif
1600 var loaded = true
Bram Moolenaard8448622022-01-07 21:39:52 +00001601
Bram Moolenaara749a422022-02-12 19:52:25 +00001602 var notReloaded = 'yes'
1603 reloaded = 'first'
Bram Moolenaard8448622022-01-07 21:39:52 +00001604 def g:Values(): list<string>
Bram Moolenaara749a422022-02-12 19:52:25 +00001605 return [reloaded, notReloaded, Again(), Once(), exp.exported]
Bram Moolenaard8448622022-01-07 21:39:52 +00001606 enddef
1607
1608 def Once(): string
1609 return 'once'
1610 enddef
1611 END
1612 writefile(lines, 'XReloaded')
1613 g:loadCount = 0
1614 source XReloaded
1615 assert_equal(1, g:loadCount)
1616 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1617 source XReloaded
1618 assert_equal(2, g:loadCount)
1619 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1620 source XReloaded
1621 assert_equal(3, g:loadCount)
1622 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1623
1624 delete('XReloaded')
1625 delete('XExportReload')
1626 delfunc g:Values
1627 unlet g:loadCount
1628
1629 lines =<< trim END
1630 vim9script
1631 def Inner()
1632 enddef
1633 END
1634 lines->writefile('XreloadScript.vim')
1635 source XreloadScript.vim
1636
1637 lines =<< trim END
1638 vim9script
1639 def Outer()
1640 def Inner()
1641 enddef
1642 enddef
1643 defcompile
1644 END
1645 lines->writefile('XreloadScript.vim')
1646 source XreloadScript.vim
1647
1648 delete('XreloadScript.vim')
1649enddef
1650
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001651def Test_vim_reload_noclear_arg_count()
1652 var lines =<< trim END
1653 vim9script noclear
1654
1655 if !exists('g:didload')
1656 def Test(a: string, b: string)
1657 echo a b
1658 enddef
1659 def Call()
1660 Test('a', 'b')
1661 enddef
1662 else
1663 # redefine with one argument less
1664 def Test(a: string)
1665 echo a
1666 enddef
1667 endif
1668 Call()
1669 g:didload = 1
1670 END
1671 lines->writefile('XreloadScript_1.vim')
1672 source XreloadScript_1.vim
1673 assert_fails('source XreloadScript_1.vim', 'E1106: One argument too many')
1674 unlet g:didload
1675
1676 lines =<< trim END
1677 vim9script noclear
1678
1679 if !exists('g:didload')
1680 def Test(a: string, b: string, c: string)
1681 echo a b
1682 enddef
1683 def Call()
1684 Test('a', 'b', 'c')
1685 enddef
1686 else
1687 # redefine with one argument less
1688 def Test(a: string)
1689 echo a
1690 enddef
1691 endif
1692 Call()
1693 g:didload = 1
1694 END
1695 lines->writefile('XreloadScript_2.vim')
1696 source XreloadScript_2.vim
1697 assert_fails('source XreloadScript_2.vim', 'E1106: 2 arguments too many')
1698 unlet g:didload
1699
1700 lines =<< trim END
1701 vim9script noclear
1702
1703 if !exists('g:didload')
1704 def Test(a: string)
1705 echo a
1706 enddef
1707 def Call()
1708 Test('a')
1709 enddef
1710 else
1711 # redefine with one argument extra
1712 def Test(a: string, b: string)
1713 echo a b
1714 enddef
1715 endif
1716 Call()
1717 g:didload = 1
1718 END
1719 lines->writefile('XreloadScript_3.vim')
1720 source XreloadScript_3.vim
1721 assert_fails('source XreloadScript_3.vim', 'E1190: One argument too few')
1722 unlet g:didload
1723
1724 lines =<< trim END
1725 vim9script noclear
1726
1727 if !exists('g:didload')
1728 def Test(a: string)
1729 echo a
1730 enddef
1731 def Call()
1732 Test('a')
1733 enddef
1734 else
1735 # redefine with two arguments extra
1736 def Test(a: string, b: string, c: string)
1737 echo a b
1738 enddef
1739 endif
1740 Call()
1741 g:didload = 1
1742 END
1743 lines->writefile('XreloadScript_4.vim')
1744 source XreloadScript_4.vim
1745 assert_fails('source XreloadScript_4.vim', 'E1190: 2 arguments too few')
1746 unlet g:didload
1747
1748 delete('XreloadScript_1.vim')
1749 delete('XreloadScript_2.vim')
1750 delete('XreloadScript_3.vim')
1751 delete('XreloadScript_4.vim')
1752enddef
1753
1754def Test_vim9_reload_noclear_error()
1755 var lines =<< trim END
1756 vim9script noclear
1757
1758 if !exists('g:didload')
1759 def Test(a: string)
1760 echo a
1761 enddef
1762 def Call()
1763 Test('a')
1764 enddef
1765 else
1766 # redefine with a compile error
1767 def Test(a: string)
1768 echo ax
1769 enddef
1770 endif
1771 Call()
1772 g:didload = 1
1773 END
1774 lines->writefile('XreloadScriptErr.vim')
1775 source XreloadScriptErr.vim
1776 assert_fails('source XreloadScriptErr.vim', 'E1001: Variable not found: ax')
1777
1778 unlet g:didload
1779 delete('XreloadScriptErr.vim')
1780enddef
1781
Bram Moolenaard8448622022-01-07 21:39:52 +00001782def Test_vim9_reload_import()
1783 var lines =<< trim END
1784 vim9script
1785 const var = ''
1786 var valone = 1234
1787 def MyFunc(arg: string)
1788 valone = 5678
1789 enddef
1790 END
1791 var morelines =<< trim END
1792 var valtwo = 222
1793 export def GetValtwo(): number
1794 return valtwo
1795 enddef
1796 END
1797 writefile(lines + morelines, 'Xreload.vim')
1798 source Xreload.vim
1799 source Xreload.vim
1800 source Xreload.vim
1801
1802 # cannot declare a var twice
1803 lines =<< trim END
1804 vim9script
1805 var valone = 1234
1806 var valone = 5678
1807 END
1808 writefile(lines, 'Xreload.vim')
1809 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1810
1811 delete('Xreload.vim')
1812 delete('Ximport.vim')
1813enddef
1814
1815" if a script is reloaded with a script-local variable that changed its type, a
1816" compiled function using that variable must fail.
1817def Test_script_reload_change_type()
1818 var lines =<< trim END
1819 vim9script noclear
1820 var str = 'string'
1821 def g:GetStr(): string
1822 return str .. 'xxx'
1823 enddef
1824 END
1825 writefile(lines, 'Xreload.vim')
1826 source Xreload.vim
1827 echo g:GetStr()
1828
1829 lines =<< trim END
1830 vim9script noclear
1831 var str = 1234
1832 END
1833 writefile(lines, 'Xreload.vim')
1834 source Xreload.vim
1835 assert_fails('echo g:GetStr()', 'E1150:')
1836
1837 delfunc g:GetStr
1838 delete('Xreload.vim')
1839enddef
1840
1841" Define CallFunc so that the test can be compiled
1842command CallFunc echo 'nop'
1843
1844def Test_script_reload_from_function()
1845 var lines =<< trim END
1846 vim9script
1847
Bram Moolenaar10611952022-04-03 21:11:34 +01001848 if exists('g:loadedThis')
Bram Moolenaard8448622022-01-07 21:39:52 +00001849 finish
1850 endif
Bram Moolenaar10611952022-04-03 21:11:34 +01001851 g:loadedThis = 1
Bram Moolenaard8448622022-01-07 21:39:52 +00001852 delcommand CallFunc
1853 command CallFunc Func()
1854 def Func()
1855 so XreloadFunc.vim
1856 g:didTheFunc = 1
1857 enddef
1858 END
1859 writefile(lines, 'XreloadFunc.vim')
1860 source XreloadFunc.vim
1861 CallFunc
1862 assert_equal(1, g:didTheFunc)
1863
1864 delete('XreloadFunc.vim')
1865 delcommand CallFunc
Bram Moolenaar10611952022-04-03 21:11:34 +01001866 unlet g:loadedThis
Bram Moolenaard8448622022-01-07 21:39:52 +00001867 unlet g:didTheFunc
1868enddef
1869
1870def s:RetSome(): string
1871 return 'some'
1872enddef
1873
1874" Not exported function that is referenced needs to be accessed by the
1875" script-local name.
1876def Test_vim9_funcref()
1877 var sortlines =<< trim END
1878 vim9script
1879 def Compare(i1: number, i2: number): number
1880 return i2 - i1
1881 enddef
1882
1883 export def FastSort(): list<number>
1884 return range(5)->sort(Compare)
1885 enddef
1886
1887 export def GetString(arg: string): string
1888 return arg
1889 enddef
1890 END
1891 writefile(sortlines, 'Xsort.vim')
1892
1893 var lines =<< trim END
1894 vim9script
1895 import './Xsort.vim'
1896 def Test()
1897 g:result = Xsort.FastSort()
1898 enddef
1899 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001900 END
1901 writefile(lines, 'Xscript.vim')
1902 source Xscript.vim
1903 assert_equal([4, 3, 2, 1, 0], g:result)
1904 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00001905
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001906 lines =<< trim END
1907 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00001908 # using a function imported with "as"
1909 import './Xsort.vim' as anAlias
1910 assert_equal('yes', anAlias.GetString('yes'))
1911
1912 # using the function from a compiled function
1913 def TestMore(): string
1914 var s = s:anAlias.GetString('foo')
1915 return s .. anAlias.GetString('bar')
1916 enddef
1917 assert_equal('foobar', TestMore())
1918
1919 # error when using a function that isn't exported
1920 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1921 END
1922 writefile(lines, 'Xscript.vim')
1923
Bram Moolenaard8448622022-01-07 21:39:52 +00001924 delete('Xsort.vim')
1925 delete('Xscript.vim')
1926
1927 var Funcref = function('s:RetSome')
1928 assert_equal('some', Funcref())
1929enddef
1930
1931" Check that when searching for "FilterFunc" it finds the import in the
1932" script where FastFilter() is called from, both as a string and as a direct
1933" function reference.
1934def Test_vim9_funcref_other_script()
1935 var filterLines =<< trim END
1936 vim9script
1937 export def FilterFunc(idx: number, val: number): bool
1938 return idx % 2 == 1
1939 enddef
1940 export def FastFilter(): list<number>
1941 return range(10)->filter('FilterFunc(v:key, v:val)')
1942 enddef
1943 export def FastFilterDirect(): list<number>
1944 return range(10)->filter(FilterFunc)
1945 enddef
1946 END
1947 writefile(filterLines, 'Xfilter.vim')
1948
1949 var lines =<< trim END
1950 vim9script
1951 import './Xfilter.vim' as filter
1952 def Test()
1953 var x: list<number> = filter.FastFilter()
1954 enddef
1955 Test()
1956 def TestDirect()
1957 var x: list<number> = filter.FastFilterDirect()
1958 enddef
1959 TestDirect()
1960 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001961 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +00001962 delete('Xfilter.vim')
1963enddef
1964
1965def Test_import_absolute()
1966 var import_lines = [
1967 'vim9script',
1968 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
1969 'def UseExported()',
1970 ' g:imported_abs = abs.exported',
1971 ' abs.exported = 8888',
1972 ' g:imported_after = abs.exported',
1973 'enddef',
1974 'UseExported()',
1975 'g:import_disassembled = execute("disass UseExported")',
1976 ]
1977 writefile(import_lines, 'Ximport_abs.vim')
1978 writefile(s:export_script_lines, 'Xexport_abs.vim')
1979
1980 source Ximport_abs.vim
1981
1982 assert_equal(9876, g:imported_abs)
1983 assert_equal(8888, g:imported_after)
1984 assert_match('<SNR>\d\+_UseExported\_s*' ..
1985 'g:imported_abs = abs.exported\_s*' ..
1986 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1987 '1 STOREG g:imported_abs\_s*' ..
1988 'abs.exported = 8888\_s*' ..
1989 '2 PUSHNR 8888\_s*' ..
1990 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1991 'g:imported_after = abs.exported\_s*' ..
1992 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1993 '5 STOREG g:imported_after',
1994 g:import_disassembled)
1995
1996 Undo_export_script_lines()
1997 unlet g:imported_abs
1998 unlet g:import_disassembled
1999
2000 delete('Ximport_abs.vim')
2001 delete('Xexport_abs.vim')
2002enddef
2003
2004def Test_import_rtp()
2005 var import_lines = [
2006 'vim9script',
2007 'import "Xexport_rtp.vim" as rtp',
2008 'g:imported_rtp = rtp.exported',
2009 ]
2010 writefile(import_lines, 'Ximport_rtp.vim')
2011 mkdir('import', 'p')
2012 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
2013
2014 var save_rtp = &rtp
2015 &rtp = getcwd()
2016 source Ximport_rtp.vim
2017 &rtp = save_rtp
2018
2019 assert_equal(9876, g:imported_rtp)
2020
2021 Undo_export_script_lines()
2022 unlet g:imported_rtp
2023 delete('Ximport_rtp.vim')
2024 delete('import', 'rf')
2025enddef
2026
2027def Test_import_compile_error()
2028 var export_lines = [
2029 'vim9script',
2030 'export def ExpFunc(): string',
2031 ' return notDefined',
2032 'enddef',
2033 ]
2034 writefile(export_lines, 'Xexported.vim')
2035
2036 var import_lines = [
2037 'vim9script',
2038 'import "./Xexported.vim" as expo',
2039 'def ImpFunc()',
2040 ' echo expo.ExpFunc()',
2041 'enddef',
2042 'defcompile',
2043 ]
2044 writefile(import_lines, 'Ximport.vim')
2045
2046 try
2047 source Ximport.vim
2048 catch /E1001/
2049 # Error should be before the Xexported.vim file.
2050 assert_match('E1001: Variable not found: notDefined', v:exception)
2051 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
2052 endtry
2053
2054 delete('Xexported.vim')
2055 delete('Ximport.vim')
2056enddef
2057
2058def Test_func_overrules_import_fails()
2059 var export_lines =<< trim END
2060 vim9script
2061 export def Func()
2062 echo 'imported'
2063 enddef
2064 END
2065 writefile(export_lines, 'XexportedFunc.vim')
2066
2067 var lines =<< trim END
2068 vim9script
2069 import './XexportedFunc.vim' as Func
2070 def Func()
2071 echo 'local to function'
2072 enddef
2073 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002074 v9.CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00002075
2076 lines =<< trim END
2077 vim9script
2078 import './XexportedFunc.vim' as Func
2079 def Outer()
2080 def Func()
2081 echo 'local to function'
2082 enddef
2083 enddef
2084 defcompile
2085 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002086 v9.CheckScriptFailure(lines, 'E1236:')
Bram Moolenaard8448622022-01-07 21:39:52 +00002087
2088 delete('XexportedFunc.vim')
2089enddef
2090
2091def Test_source_vim9_from_legacy()
2092 var vim9_lines =<< trim END
2093 vim9script
2094 var local = 'local'
2095 g:global = 'global'
2096 export var exported = 'exported'
2097 export def GetText(): string
2098 return 'text'
2099 enddef
2100 END
2101 writefile(vim9_lines, 'Xvim9_script.vim')
2102
2103 var legacy_lines =<< trim END
2104 source Xvim9_script.vim
2105
2106 call assert_false(exists('local'))
2107 call assert_false(exists('exported'))
2108 call assert_false(exists('s:exported'))
2109 call assert_equal('global', global)
2110 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00002111 END
2112 writefile(legacy_lines, 'Xlegacy_script.vim')
2113
2114 source Xlegacy_script.vim
2115 assert_equal('global', g:global)
2116 unlet g:global
2117
2118 delete('Xlegacy_script.vim')
2119 delete('Xvim9_script.vim')
2120enddef
2121
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002122def Test_import_vim9_from_legacy()
2123 var vim9_lines =<< trim END
2124 vim9script
2125 var local = 'local'
2126 g:global = 'global'
2127 export var exported = 'exported'
2128 export def GetText(): string
2129 return 'text'
2130 enddef
2131 END
2132 writefile(vim9_lines, 'Xvim9_export.vim')
2133
2134 var legacy_lines =<< trim END
2135 import './Xvim9_export.vim' as vim9
2136
2137 call assert_false(exists('vim9'))
2138 call assert_false(exists('local'))
2139 call assert_false(exists('s:vim9.local'))
2140 call assert_equal('global', global)
2141 call assert_equal('global', g:global)
2142 call assert_false(exists('exported'))
2143 call assert_false(exists('s:exported'))
2144 call assert_false(exists('*GetText'))
2145
2146 " imported symbol is script-local
2147 call assert_equal('exported', s:vim9.exported)
2148 call assert_equal('text', s:vim9.GetText())
2149 END
2150 writefile(legacy_lines, 'Xlegacy_script.vim')
2151
2152 source Xlegacy_script.vim
2153 assert_equal('global', g:global)
2154 unlet g:global
2155
2156 delete('Xlegacy_script.vim')
2157 delete('Xvim9_export.vim')
2158enddef
2159
Bram Moolenaard8448622022-01-07 21:39:52 +00002160def Test_cmdline_win()
2161 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
2162 # the command line window.
2163 mkdir('rtp/syntax', 'p')
2164 var export_lines =<< trim END
2165 vim9script
2166 export var That = 'yes'
2167 END
2168 writefile(export_lines, 'rtp/syntax/Xexport.vim')
2169 var import_lines =<< trim END
2170 vim9script
2171 import './Xexport.vim' as exp
2172 echo exp.That
2173 END
2174 writefile(import_lines, 'rtp/syntax/vim.vim')
2175 var save_rtp = &rtp
2176 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
2177 syntax on
2178 augroup CmdWin
2179 autocmd CmdwinEnter * g:got_there = 'yes'
2180 augroup END
2181 # this will open and also close the cmdline window
2182 feedkeys('q:', 'xt')
2183 assert_equal('yes', g:got_there)
2184
2185 augroup CmdWin
2186 au!
2187 augroup END
2188 &rtp = save_rtp
2189 delete('rtp', 'rf')
2190enddef
2191
2192def Test_import_gone_when_sourced_twice()
2193 var exportlines =<< trim END
2194 vim9script
2195 if exists('g:guard')
2196 finish
2197 endif
2198 g:guard = 1
2199 export var name = 'someName'
2200 END
2201 writefile(exportlines, 'XexportScript.vim')
2202
2203 var lines =<< trim END
2204 vim9script
2205 import './XexportScript.vim' as expo
2206 def g:GetName(): string
2207 return expo.name
2208 enddef
2209 END
2210 writefile(lines, 'XscriptImport.vim')
2211 so XscriptImport.vim
2212 assert_equal('someName', g:GetName())
2213
2214 so XexportScript.vim
2215 assert_fails('call g:GetName()', 'E1149:')
2216
2217 delfunc g:GetName
2218 delete('XexportScript.vim')
2219 delete('XscriptImport.vim')
2220 unlet g:guard
2221enddef
2222
Bram Moolenaar160aa862022-01-10 21:29:57 +00002223" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002224def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002225 var lines =<< trim END
2226 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002227 export def Gettest(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002228 return 'test'
2229 enddef
2230 g:some#name = 'name'
2231 g:some#dict = {key: 'value'}
2232
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002233 export def Varargs(a1: string, ...l: list<string>): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002234 return a1 .. l[0] .. l[1]
2235 enddef
2236 END
2237
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002238 mkdir('Xfulldir/autoload', 'p')
2239 writefile(lines, 'Xfulldir/autoload/some.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002240 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002241 exe 'set rtp^=' .. getcwd() .. '/Xfulldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002242
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002243 assert_equal('test', g:some#Gettest())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002244 assert_equal('name', g:some#name)
2245 assert_equal('value', g:some#dict.key)
2246 g:some#other = 'other'
2247 assert_equal('other', g:some#other)
2248
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002249 assert_equal('abc', some#Varargs('a', 'b', 'c'))
Bram Moolenaar160aa862022-01-10 21:29:57 +00002250
2251 # upper case script name works
2252 lines =<< trim END
2253 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002254 export def GetOther(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002255 return 'other'
2256 enddef
2257 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002258 writefile(lines, 'Xfulldir/autoload/Other.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002259 assert_equal('other', g:Other#GetOther())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002260
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002261 delete('Xfulldir', 'rf')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002262 &rtp = save_rtp
2263enddef
2264
2265def Test_vim9script_autoload()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002266 mkdir('Xaldir/autoload', 'p')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002267 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002268 exe 'set rtp^=' .. getcwd() .. '/Xaldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002269
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002270 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00002271 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002272 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002273 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00002274
2275 export def Gettest(): string
2276 return 'test'
2277 enddef
2278
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002279 export var name = 'name'
2280
2281 export func GetFunc()
2282 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00002283 endfunc
2284
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002285 export def GetDef(): string
2286 return Gettest() .. 'more' .. name
2287 enddef
2288
Bram Moolenaar160aa862022-01-10 21:29:57 +00002289 export final fname = 'final'
2290 export const cname = 'const'
2291 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002292 writefile(lines, 'Xaldir/autoload/prefixed.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002293
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002294 g:prefixed_loaded = 0
2295 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00002296 lines =<< trim END
2297 vim9script
2298 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002299 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002300 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002301 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002302
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002303 assert_equal('testmorename', prefixed.GetFunc())
2304 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002305 assert_equal('name', prefixed.name)
2306 assert_equal('final', prefixed.fname)
2307 assert_equal('const', prefixed.cname)
2308 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002309 v9.CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002310 # can source it again, autoload script not loaded again
2311 g:expected_loaded = 1
Bram Moolenaar62aec932022-01-29 21:45:34 +00002312 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002313
2314 # can also get the items by autoload name
2315 lines =<< trim END
2316 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002317 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002318 call assert_equal('name', prefixed#name)
2319 call assert_equal('final', prefixed#fname)
2320 call assert_equal('const', prefixed#cname)
2321 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002322 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002323
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002324 unlet g:prefixed_loaded
2325 unlet g:expected_loaded
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002326 delete('Xaldir', 'rf')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002327 &rtp = save_rtp
2328enddef
2329
Bram Moolenaard02dce22022-01-18 17:43:04 +00002330def Test_import_autoload_not_exported()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002331 mkdir('Xnimdir/autoload', 'p')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002332 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002333 exe 'set rtp^=' .. getcwd() .. '/Xnimdir'
Bram Moolenaard02dce22022-01-18 17:43:04 +00002334
2335 # error when using an item that is not exported from an autoload script
2336 var exportLines =<< trim END
2337 vim9script
2338 var notExported = 123
2339 def NotExport()
2340 echo 'nop'
2341 enddef
2342 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002343 writefile(exportLines, 'Xnimdir/autoload/notExport1.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002344
2345 var lines =<< trim END
2346 vim9script
2347 import autoload 'notExport1.vim'
2348 echo notExport1.notFound
2349 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002350 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002351
2352 lines =<< trim END
2353 vim9script
2354 import autoload 'notExport1.vim'
2355 echo notExport1.notExported
2356 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002357 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002358
2359 lines =<< trim END
2360 vim9script
2361 import autoload 'notExport1.vim'
2362 echo notExport1.NotFunc()
2363 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002364 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002365
2366 lines =<< trim END
2367 vim9script
2368 import autoload 'notExport1.vim'
2369 echo notExport1.NotExport()
2370 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002371 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002372
2373 lines =<< trim END
2374 vim9script
2375 import autoload 'notExport1.vim'
2376 echo 'text'->notExport1.NotFunc()
2377 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002378 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002379
2380 lines =<< trim END
2381 vim9script
2382 import autoload 'notExport1.vim'
2383 echo 'text'->notExport1.NotExport()
2384 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002385 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002386
2387 # using a :def function we use a different autoload script every time so that
2388 # the function is compiled without the script loaded
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002389 writefile(exportLines, 'Xnimdir/autoload/notExport2.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002390 lines =<< trim END
2391 vim9script
2392 import autoload 'notExport2.vim'
2393 def Testit()
2394 echo notExport2.notFound
2395 enddef
2396 Testit()
2397 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002398 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002399
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002400 writefile(exportLines, 'Xnimdir/autoload/notExport3.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002401 lines =<< trim END
2402 vim9script
2403 import autoload 'notExport3.vim'
2404 def Testit()
2405 echo notExport3.notExported
2406 enddef
2407 Testit()
2408 END
2409 # don't get E1049 because it is too complicated to figure out
Bram Moolenaar62aec932022-01-29 21:45:34 +00002410 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002411
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002412 writefile(exportLines, 'Xnimdir/autoload/notExport4.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002413 lines =<< trim END
2414 vim9script
2415 import autoload 'notExport4.vim'
2416 def Testit()
2417 echo notExport4.NotFunc()
2418 enddef
2419 Testit()
2420 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002421 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002422
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002423 writefile(exportLines, 'Xnimdir/autoload/notExport5.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002424 lines =<< trim END
2425 vim9script
2426 import autoload 'notExport5.vim'
2427 def Testit()
2428 echo notExport5.NotExport()
2429 enddef
2430 Testit()
2431 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002432 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002433
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002434 writefile(exportLines, 'Xnimdir/autoload/notExport6.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002435 lines =<< trim END
2436 vim9script
2437 import autoload 'notExport6.vim'
2438 def Testit()
2439 echo 'text'->notExport6.NotFunc()
2440 enddef
2441 Testit()
2442 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002443 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002444
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002445 writefile(exportLines, 'Xnimdir/autoload/notExport7.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002446 lines =<< trim END
2447 vim9script
2448 import autoload 'notExport7.vim'
2449 def Testit()
2450 echo 'text'->notExport7.NotExport()
2451 enddef
2452 Testit()
2453 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002454 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002455
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002456 delete('Xnimdir', 'rf')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002457 &rtp = save_rtp
2458enddef
2459
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002460def Test_vim9script_autoload_call()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002461 mkdir('Xcalldir/autoload', 'p')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002462 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002463 exe 'set rtp^=' .. getcwd() .. '/Xcalldir'
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002464
2465 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002466 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002467
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002468 export def RetArg(arg: string): string
2469 return arg
2470 enddef
2471
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002472 export def Getother()
2473 g:result = 'other'
2474 enddef
2475 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002476 writefile(lines, 'Xcalldir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002477
2478 lines =<< trim END
2479 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00002480 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002481
2482 # compile this before 'another.vim' is loaded
2483 def CallAnother()
2484 assert_equal('foo', 'foo'->another.RetArg())
2485 enddef
2486 CallAnother()
2487
Bram Moolenaar5d982692022-01-12 15:15:27 +00002488 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002489 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00002490
2491 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaar8164f6e2022-02-06 13:08:41 +00002492
2493 verbose function another.Getother
2494 # should we disallow this?
2495 verbose function another#Getother
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002496 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002497 v9.CheckScriptSuccess(lines)
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002498
2499 unlet g:result
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002500 delete('Xcalldir', 'rf')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002501 &rtp = save_rtp
2502enddef
2503
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002504def Test_vim9script_noclear_autoload()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002505 mkdir('Xnocdir/autoload', 'p')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002506 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002507 exe 'set rtp^=' .. getcwd() .. '/Xnocdir'
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002508
2509 var lines =<< trim END
2510 vim9script
2511 export def Func(): string
2512 return 'called'
2513 enddef
2514 g:double_loaded = 'yes'
2515 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002516 writefile(lines, 'Xnocdir/autoload/double.vim')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002517
2518 lines =<< trim END
2519 vim9script noclear
2520 if exists('g:script_loaded')
2521 finish
2522 endif
2523 g:script_loaded = true
2524
2525 import autoload 'double.vim'
2526 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
2527 END
2528 g:double_loaded = 'no'
2529 writefile(lines, 'Xloaddouble')
2530 source Xloaddouble
2531 assert_equal('no', g:double_loaded)
2532 assert_equal(true, g:script_loaded)
2533 source Xloaddouble
2534 feedkeys("\<F3>", 'xt')
2535 assert_equal('called', g:result)
2536 assert_equal('yes', g:double_loaded)
2537
2538 delete('Xloaddouble')
2539 unlet g:double_loaded
2540 unlet g:script_loaded
2541 unlet g:result
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002542 delete('Xnocdir', 'rf')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002543 &rtp = save_rtp
2544enddef
2545
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002546def Test_vim9script_autoload_duplicate()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002547 mkdir('Xdupdir/autoload', 'p')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002548
2549 var lines =<< trim END
2550 vim9script
2551
2552 export def Func()
2553 enddef
2554
2555 def Func()
2556 enddef
2557 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002558 writefile(lines, 'Xdupdir/autoload/dupfunc.vim')
2559 assert_fails('source Xdupdir/autoload/dupfunc.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002560
2561 lines =<< trim END
2562 vim9script
2563
2564 def Func()
2565 enddef
2566
2567 export def Func()
2568 enddef
2569 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002570 writefile(lines, 'Xdupdir/autoload/dup2func.vim')
2571 assert_fails('source Xdupdir/autoload/dup2func.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002572
2573 lines =<< trim END
2574 vim9script
2575
2576 def Func()
2577 enddef
2578
2579 export var Func = 'asdf'
2580 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002581 writefile(lines, 'Xdupdir/autoload/dup3func.vim')
2582 assert_fails('source Xdupdir/autoload/dup3func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002583
2584 lines =<< trim END
2585 vim9script
2586
2587 export var Func = 'asdf'
2588
2589 def Func()
2590 enddef
2591 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002592 writefile(lines, 'Xdupdir/autoload/dup4func.vim')
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01002593 assert_fails('source Xdupdir/autoload/dup4func.vim', 'E1041:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002594
2595 lines =<< trim END
2596 vim9script
2597
2598 var Func = 'asdf'
2599
2600 export def Func()
2601 enddef
2602 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002603 writefile(lines, 'Xdupdir/autoload/dup5func.vim')
2604 assert_fails('source Xdupdir/autoload/dup5func.vim', 'E707:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002605
2606 lines =<< trim END
2607 vim9script
2608
2609 export def Func()
2610 enddef
2611
2612 var Func = 'asdf'
2613 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002614 writefile(lines, 'Xdupdir/autoload/dup6func.vim')
2615 assert_fails('source Xdupdir/autoload/dup6func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002616
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002617 delete('Xdupdir', 'rf')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002618enddef
2619
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002620def Test_autoload_missing_function_name()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002621 mkdir('Xmisdir/autoload', 'p')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002622
2623 var lines =<< trim END
2624 vim9script
2625
2626 def loadme#()
2627 enddef
2628 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002629 writefile(lines, 'Xmisdir/autoload/loadme.vim')
2630 assert_fails('source Xmisdir/autoload/loadme.vim', 'E129:')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002631
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002632 delete('Xmisdir', 'rf')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002633enddef
2634
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002635def Test_autoload_name_wrong()
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002636 var lines =<< trim END
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002637 def Xscriptname#Func()
2638 enddef
2639 END
2640 writefile(lines, 'Xscriptname.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002641 v9.CheckScriptFailure(lines, 'E746:')
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00002642 delete('Xscriptname.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002643
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002644 mkdir('Xwrodir/autoload', 'p')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002645 lines =<< trim END
2646 vim9script
2647 def somescript#Func()
2648 enddef
2649 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002650 writefile(lines, 'Xwrodir/autoload/somescript.vim')
2651 assert_fails('source Xwrodir/autoload/somescript.vim', 'E1263:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002652
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002653 delete('Xwrodir', 'rf')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002654enddef
2655
Bram Moolenaard041f422022-01-12 19:54:00 +00002656def Test_import_autoload_postponed()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002657 mkdir('Xpostdir/autoload', 'p')
Bram Moolenaard041f422022-01-12 19:54:00 +00002658 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002659 exe 'set rtp^=' .. getcwd() .. '/Xpostdir'
Bram Moolenaard041f422022-01-12 19:54:00 +00002660
2661 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002662 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00002663
2664 g:loaded_postponed = 'true'
2665 export var variable = 'bla'
2666 export def Function(): string
2667 return 'bla'
2668 enddef
2669 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002670 writefile(lines, 'Xpostdir/autoload/postponed.vim')
Bram Moolenaard041f422022-01-12 19:54:00 +00002671
2672 lines =<< trim END
2673 vim9script
2674
2675 import autoload 'postponed.vim'
2676 def Tryit()
2677 echo postponed.variable
2678 echo postponed.Function()
2679 enddef
2680 defcompile
2681 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002682 v9.CheckScriptSuccess(lines)
Bram Moolenaard041f422022-01-12 19:54:00 +00002683 assert_false(exists('g:loaded_postponed'))
Bram Moolenaar62aec932022-01-29 21:45:34 +00002684 v9.CheckScriptSuccess(lines + ['Tryit()'])
Bram Moolenaard041f422022-01-12 19:54:00 +00002685 assert_equal('true', g:loaded_postponed)
2686
2687 unlet g:loaded_postponed
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002688 delete('Xpostdir', 'rf')
Bram Moolenaard041f422022-01-12 19:54:00 +00002689 &rtp = save_rtp
2690enddef
2691
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002692def Test_import_autoload_override()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002693 mkdir('Xoverdir/autoload', 'p')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002694 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002695 exe 'set rtp^=' .. getcwd() .. '/Xoverdir'
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002696 test_override('autoload', 1)
2697
2698 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002699 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002700
2701 g:loaded_override = 'true'
2702 export var variable = 'bla'
2703 export def Function(): string
2704 return 'bla'
2705 enddef
2706 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002707 writefile(lines, 'Xoverdir/autoload/override.vim')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002708
2709 lines =<< trim END
2710 vim9script
2711
2712 import autoload 'override.vim'
2713 assert_equal('true', g:loaded_override)
2714
2715 def Tryit()
2716 echo override.doesNotExist
2717 enddef
2718 defcompile
2719 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002720 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002721
2722 test_override('autoload', 0)
2723 unlet g:loaded_override
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002724 delete('Xoverdir', 'rf')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002725 &rtp = save_rtp
2726enddef
2727
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002728def Test_autoload_mapping()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002729 mkdir('Xmapdir/autoload', 'p')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002730 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002731 exe 'set rtp^=' .. getcwd() .. '/Xmapdir'
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002732
2733 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002734 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002735
2736 g:toggle_loaded = 'yes'
2737
2738 export def Toggle(): string
2739 return ":g:toggle_called = 'yes'\<CR>"
2740 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002741 export def Doit()
2742 g:doit_called = 'yes'
2743 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002744 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002745 writefile(lines, 'Xmapdir/autoload/toggle.vim')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002746
2747 lines =<< trim END
2748 vim9script
2749
2750 import autoload 'toggle.vim'
2751
2752 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002753 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2754 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002755 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002756 v9.CheckScriptSuccess(lines)
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002757 assert_false(exists("g:toggle_loaded"))
2758 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002759 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002760
2761 feedkeys("tt", 'xt')
2762 assert_equal('yes', g:toggle_loaded)
2763 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002764 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002765
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002766 feedkeys("xx", 'xt')
2767 assert_equal('yes', g:doit_called)
2768
2769 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2770
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002771 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002772 nunmap xx
2773 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002774 unlet g:toggle_loaded
2775 unlet g:toggle_called
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002776 delete('Xmapdir', 'rf')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002777 &rtp = save_rtp
2778enddef
2779
Bram Moolenaar160aa862022-01-10 21:29:57 +00002780def Test_vim9script_autoload_fails()
2781 var lines =<< trim END
2782 vim9script autoload
2783 var n = 0
2784 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002785 v9.CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002786
2787 lines =<< trim END
2788 vim9script noclear noclear
2789 var n = 0
2790 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002791 v9.CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01002792
2793 lines =<< trim END
2794 vim9script noclears
2795 var n = 0
2796 END
2797 v9.CheckScriptFailure(lines, 'E475: Invalid argument: noclears')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002798enddef
2799
2800def Test_import_autoload_fails()
2801 var lines =<< trim END
2802 vim9script
2803 import autoload autoload 'prefixed.vim'
2804 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002805 v9.CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002806
2807 lines =<< trim END
2808 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002809 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002810 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002811 v9.CheckScriptFailure(lines, 'E282:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002812
2813 lines =<< trim END
2814 vim9script
2815 import autoload '/dir/doesNotExist.vim'
2816 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002817 v9.CheckScriptFailure(lines, 'E282:', 2)
2818
2819 lines =<< trim END
2820 vim9script
2821 import autoload '../testdir'
2822 END
2823 v9.CheckScriptFailure(lines, 'E17:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002824
2825 lines =<< trim END
2826 vim9script
2827 import autoload 'doesNotExist.vim'
2828 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002829 v9.CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002830enddef
2831
2832" test disassembling an auto-loaded function starting with "debug"
2833def Test_vim9_autoload_disass()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002834 mkdir('Xdasdir/autoload', 'p')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002835 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002836 exe 'set rtp^=' .. getcwd() .. '/Xdasdir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002837
2838 var lines =<< trim END
2839 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002840 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002841 return 'debug'
2842 enddef
2843 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002844 writefile(lines, 'Xdasdir/autoload/debugit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002845
2846 lines =<< trim END
2847 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002848 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002849 return 'profile'
2850 enddef
2851 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002852 writefile(lines, 'Xdasdir/autoload/profileit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002853
2854 lines =<< trim END
2855 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002856 assert_equal('debug', debugit#Test())
2857 disass debugit#Test
2858 assert_equal('profile', profileit#Test())
2859 disass profileit#Test
Bram Moolenaar160aa862022-01-10 21:29:57 +00002860 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002861 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002862
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002863 delete('Xdasdir', 'rf')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002864 &rtp = save_rtp
2865enddef
2866
2867" test using a vim9script that is auto-loaded from an autocmd
2868def Test_vim9_aucmd_autoload()
2869 var lines =<< trim END
2870 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002871 export def Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002872 echomsg getreg('"')
2873 enddef
2874 END
2875
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002876 mkdir('Xauldir/autoload', 'p')
2877 writefile(lines, 'Xauldir/autoload/foo.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002878 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002879 exe 'set rtp^=' .. getcwd() .. '/Xauldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002880 augroup test
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002881 autocmd TextYankPost * call foo#Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002882 augroup END
2883
2884 normal Y
2885
2886 augroup test
2887 autocmd!
2888 augroup END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002889 delete('Xauldir', 'rf')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002890 &rtp = save_rtp
2891enddef
2892
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002893" test using a autoloaded file that is case sensitive
2894def Test_vim9_autoload_case_sensitive()
2895 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002896 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002897 export def CaseSensitive(): string
2898 return 'done'
2899 enddef
2900 END
2901
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002902 mkdir('Xcasedir/autoload', 'p')
2903 writefile(lines, 'Xcasedir/autoload/CaseSensitive.vim')
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002904 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002905 exe 'set rtp^=' .. getcwd() .. '/Xcasedir'
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002906
2907 lines =<< trim END
2908 vim9script
2909 import autoload 'CaseSensitive.vim'
2910 assert_equal('done', CaseSensitive.CaseSensitive())
2911 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002912 v9.CheckScriptSuccess(lines)
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002913
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002914 if !has('fname_case')
2915 lines =<< trim END
2916 vim9script
2917 import autoload 'CaseSensitive.vim'
2918 import autoload 'casesensitive.vim'
2919 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002920 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002921 endif
2922
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002923 delete('Xcasedir', 'rf')
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002924 &rtp = save_rtp
2925enddef
2926
Bram Moolenaar160aa862022-01-10 21:29:57 +00002927" This was causing a crash because suppress_errthrow wasn't reset.
2928def Test_vim9_autoload_error()
2929 var lines =<< trim END
2930 vim9script
2931 def crash#func()
2932 try
2933 for x in List()
2934 endfor
2935 catch
2936 endtry
2937 g:ok = true
2938 enddef
2939 fu List()
2940 invalid
2941 endfu
2942 try
2943 alsoinvalid
2944 catch /wontmatch/
2945 endtry
2946 END
2947 call mkdir('Xruntime/autoload', 'p')
2948 call writefile(lines, 'Xruntime/autoload/crash.vim')
2949
2950 # run in a separate Vim to avoid the side effects of assert_fails()
2951 lines =<< trim END
2952 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
2953 call crash#func()
2954 call writefile(['ok'], 'Xdidit')
2955 qall!
2956 END
2957 writefile(lines, 'Xscript')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002958 g:RunVim([], [], '-S Xscript')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002959 assert_equal(['ok'], readfile('Xdidit'))
2960
2961 delete('Xdidit')
2962 delete('Xscript')
2963 delete('Xruntime', 'rf')
2964
2965 lines =<< trim END
2966 vim9script
2967 var foo#bar = 'asdf'
2968 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002969 v9.CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002970enddef
2971
Bram Moolenaar753885b2022-08-24 16:30:36 +01002972def Test_vim9_import_symlink()
2973 if !has('unix')
2974 CheckUnix
2975 else
2976 mkdir('Xto/plugin', 'p')
2977 var lines =<< trim END
2978 vim9script
2979 import autoload 'bar.vim'
2980 g:resultFunc = bar.Func()
2981 g:resultValue = bar.value
2982 END
2983 writefile(lines, 'Xto/plugin/foo.vim')
2984
2985 mkdir('Xto/autoload', 'p')
2986 lines =<< trim END
2987 vim9script
2988 export def Func(): string
2989 return 'func'
2990 enddef
2991 export var value = 'val'
2992 END
2993 writefile(lines, 'Xto/autoload/bar.vim')
2994
2995 var save_rtp = &rtp
2996 &rtp = getcwd() .. '/Xfrom'
2997 system('ln -s ' .. getcwd() .. '/Xto Xfrom')
2998
2999 source Xfrom/plugin/foo.vim
3000 assert_equal('func', g:resultFunc)
3001 assert_equal('val', g:resultValue)
3002
3003 var infoTo = getscriptinfo()->filter((_, v) => v.name =~ 'Xto/autoload/bar')
3004 var infoFrom = getscriptinfo()->filter((_, v) => v.name =~ 'Xfrom/autoload/bar')
3005 assert_equal(1, len(infoTo))
3006 assert_equal(1, len(infoFrom))
3007 assert_equal(infoTo[0].sid, infoFrom[0].sourced)
Bram Moolenaar7ea9fcb2022-08-24 17:46:12 +01003008 var output: string
3009 redir => output
3010 scriptnames
3011 redir END
3012 assert_match(infoFrom[0].sid .. '->' .. infoFrom[0].sourced .. '.*Xfrom', output)
Bram Moolenaar753885b2022-08-24 16:30:36 +01003013
3014 unlet g:resultFunc
3015 unlet g:resultValue
3016 &rtp = save_rtp
3017 delete('Xto', 'rf')
3018 delete('Xfrom', 'rf')
3019 endif
3020enddef
3021
Bram Moolenaard8448622022-01-07 21:39:52 +00003022
3023" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker