blob: e844d4a0827fb8807997bb5de615d0ba17f02ec4 [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 Moolenaarc2f17f72022-02-21 13:13:50 +0000455def Test_import_duplicate_function()
456 # Function Hover() exists in both scripts, partial should refer to the right
457 # one.
458 var lines =<< trim END
459 vim9script
460
461 def Hover(d: dict<any>): string
462 return 'found it'
463 enddef
464
465 export def NewLspServer(): dict<any>
466 var d: dict<any> = {}
467 d->extend({hover: function('Hover', [d])})
468 return d
469 enddef
470
471 NewLspServer()
472 END
473 writefile(lines, 'Xserver.vim')
474
475 lines =<< trim END
476 vim9script
477
478 import './Xserver.vim' as server
479
480 export def Hover()
481 enddef
482
483 def AddServer()
484 var d: dict<any> = server.NewLspServer()
485 assert_equal('found it', d.hover())
486 enddef
487 AddServer()
488 END
489 v9.CheckScriptSuccess(lines)
490
491 delete('Xserver.vim')
492enddef
493
494
Bram Moolenaard8448622022-01-07 21:39:52 +0000495def Test_import_fails()
496 writefile([], 'Xfoo.vim')
497 var lines =<< trim END
498 import './Xfoo.vim' as foo
499 foo = 'bar'
500 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000501 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
Bram Moolenaard8448622022-01-07 21:39:52 +0000502 lines =<< trim END
503 vim9script
504 import './Xfoo.vim' as foo
505 var that = foo
506 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000507 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000508 lines =<< trim END
509 vim9script
510 import './Xfoo.vim' as foo
511 var that: any
512 that += foo
513 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000514 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000515 lines =<< trim END
516 vim9script
517 import './Xfoo.vim' as foo
518 foo += 9
519 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000520 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaard8448622022-01-07 21:39:52 +0000521
522 lines =<< trim END
523 vim9script
524 import './Xfoo.vim' as 9foo
525 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000526 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000527 lines =<< trim END
528 vim9script
529 import './Xfoo.vim' as the#foo
530 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000531 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000532 lines =<< trim END
533 vim9script
534 import './Xfoo.vim' as g:foo
535 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000536 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000537
Bram Moolenaard8448622022-01-07 21:39:52 +0000538 lines =<< trim END
539 vim9script
540 def TheFunc()
541 echo 'the func'
542 enddef
543 export var Ref = TheFunc
544 END
545 writefile([], 'Xthat.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000546
Bram Moolenaard8448622022-01-07 21:39:52 +0000547 lines =<< trim END
548 import './Xthat.vim' as That
549 That()
550 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000551 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000552
553 lines =<< trim END
Bram Moolenaar937610b2022-01-19 17:21:29 +0000554 vim9script
555 import './Xthat.vim' as That
556 def Func()
557 echo That()
558 enddef
559 Func()
560 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000561 v9.CheckScriptFailure(lines, 'E1236: Cannot use That itself')
Bram Moolenaar937610b2022-01-19 17:21:29 +0000562
563 lines =<< trim END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000564 import './Xthat.vim' as one
565 import './Xthat.vim' as two
566 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000567 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000568
569 delete('Xthat.vim')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000570
571 lines =<< trim END
572 vim9script
573 export var item = 'hello'
574 import './Xyourself.vim'
575 END
576 writefile(lines, 'Xyourself.vim')
577 assert_fails('source Xyourself.vim', 'E1088:')
578 delete('Xyourself.vim')
579
Bram Moolenaard8448622022-01-07 21:39:52 +0000580 mkdir('Ximport')
581
582 writefile(['vim9script'], 'Ximport/.vim')
583 lines =<< trim END
584 vim9script
585 import './Ximport/.vim'
586 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000587 v9.CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
Bram Moolenaard8448622022-01-07 21:39:52 +0000588 lines =<< trim END
589 vim9script
590 import './Ximport/.vim' as vim
591 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000592 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000593
594 writefile(['vim9script'], 'Ximport/.vimrc')
595 lines =<< trim END
596 vim9script
597 import './Ximport/.vimrc'
598 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000599 v9.CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000600 lines =<< trim END
601 vim9script
602 import './Ximport/.vimrc' as vimrc
603 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000604 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000605
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100606 new
607 setline(1, ['vim9script', 'import "" as abc'])
608 assert_fails('source', 'E1071: Invalid string for :import: "" as abc')
609 setline(2, 'import [] as abc')
610 assert_fails('source', 'E1071: Invalid string for :import: [] as abc')
611 setline(2, 'import test_null_string() as abc')
612 assert_fails('source', 'E1071: Invalid string for :import: test_null_string() as abc')
613 bw!
614 call writefile(['vim9script', "import './Xfoo.vim' ask expo"], 'Xbar.vim')
615 assert_fails('source Xbar.vim', 'E488: Trailing characters: ask expo')
616 writefile([], 'Xtemp')
617 call writefile(['vim9script', "import './Xtemp'"], 'Xbar.vim')
618 assert_fails('source Xbar.vim', 'E1257: Imported script must use "as" or end in .vim: Xtemp')
619 delete('Xtemp')
620 call writefile(['vim9script', "import './Xfoo.vim' as abc | foobar"], 'Xbar.vim')
621 assert_fails('source Xbar.vim', 'E492: Not an editor command: foobar')
622 call delete('Xbar.vim')
623
Bram Moolenaard8448622022-01-07 21:39:52 +0000624 delete('Ximport', 'rf')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100625 delete('Xfoo.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000626enddef
627
628func g:Trigger()
629 source Ximport.vim
630 return "echo 'yes'\<CR>"
631endfunc
632
633def Test_import_export_expr_map()
634 # check that :import and :export work when buffer is locked
635 var export_lines =<< trim END
636 vim9script
637 export def That(): string
638 return 'yes'
639 enddef
640 END
641 writefile(export_lines, 'Xexport_that.vim')
642
643 var import_lines =<< trim END
644 vim9script
645 import './Xexport_that.vim' as that
646 assert_equal('yes', that.That())
647 END
648 writefile(import_lines, 'Ximport.vim')
649
650 nnoremap <expr> trigger g:Trigger()
651 feedkeys('trigger', "xt")
652
653 delete('Xexport_that.vim')
654 delete('Ximport.vim')
655 nunmap trigger
656enddef
657
658def Test_import_in_filetype()
659 # check that :import works when the buffer is locked
660 mkdir('ftplugin', 'p')
661 var export_lines =<< trim END
662 vim9script
663 export var That = 'yes'
664 END
665 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
666
667 var import_lines =<< trim END
668 vim9script
669 import './Xexport_ft.vim' as ft
670 assert_equal('yes', ft.That)
671 g:did_load_mytpe = 1
672 END
673 writefile(import_lines, 'ftplugin/qf.vim')
674
675 var save_rtp = &rtp
676 &rtp = getcwd() .. ',' .. &rtp
677
678 filetype plugin on
679 copen
680 assert_equal(1, g:did_load_mytpe)
681
682 quit!
683 delete('Xexport_ft.vim')
684 delete('ftplugin', 'rf')
685 &rtp = save_rtp
686enddef
687
688def Test_use_import_in_mapping()
689 var lines =<< trim END
690 vim9script
Bram Moolenaar89445512022-04-14 12:58:23 +0100691 export def Funcx(nr: number)
692 g:result = nr
Bram Moolenaard8448622022-01-07 21:39:52 +0000693 enddef
694 END
695 writefile(lines, 'XsomeExport.vim')
696 lines =<< trim END
697 vim9script
698 import './XsomeExport.vim' as some
699 var Funcy = some.Funcx
Bram Moolenaar89445512022-04-14 12:58:23 +0100700 nnoremap <F3> :call <sid>Funcy(42)<cr>
701 nnoremap <F4> :call <sid>some.Funcx(44)<cr>
Bram Moolenaard8448622022-01-07 21:39:52 +0000702 END
703 writefile(lines, 'Xmapscript.vim')
704
705 source Xmapscript.vim
706 feedkeys("\<F3>", "xt")
707 assert_equal(42, g:result)
Bram Moolenaar89445512022-04-14 12:58:23 +0100708 feedkeys("\<F4>", "xt")
709 assert_equal(44, g:result)
Bram Moolenaard8448622022-01-07 21:39:52 +0000710
711 unlet g:result
712 delete('XsomeExport.vim')
713 delete('Xmapscript.vim')
714 nunmap <F3>
Bram Moolenaar89445512022-04-14 12:58:23 +0100715 nunmap <F4>
716enddef
717
Bram Moolenaar648dd882022-04-14 21:36:15 +0100718def Test_use_relative_autoload_import_in_mapping()
Bram Moolenaar89445512022-04-14 12:58:23 +0100719 var lines =<< trim END
720 vim9script
721 export def Func()
722 g:result = 42
723 enddef
724 END
Bram Moolenaar648dd882022-04-14 21:36:15 +0100725 writefile(lines, 'XrelautoloadExport.vim')
Bram Moolenaar89445512022-04-14 12:58:23 +0100726 lines =<< trim END
727 vim9script
Bram Moolenaar648dd882022-04-14 21:36:15 +0100728 import autoload './XrelautoloadExport.vim' as some
Bram Moolenaar89445512022-04-14 12:58:23 +0100729 nnoremap <F3> :call <SID>some.Func()<CR>
730 END
731 writefile(lines, 'Xmapscript.vim')
732
733 source Xmapscript.vim
Bram Moolenaar648dd882022-04-14 21:36:15 +0100734 assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100735 var l = getscriptinfo()
736 assert_match('XrelautoloadExport.vim$', l[-1].name)
737 assert_true(l[-1].autoload)
Bram Moolenaar89445512022-04-14 12:58:23 +0100738 feedkeys("\<F3>", "xt")
739 assert_equal(42, g:result)
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100740 l = getscriptinfo({name: 'XrelautoloadExport'})
741 assert_true(len(l) == 1)
742 assert_match('XrelautoloadExport.vim$', l[0].name)
743 assert_false(l[0].autoload)
Yegappan Lakshmanan2f892d82022-08-28 18:52:10 +0100744 assert_equal(999999, l[0].version)
Bram Moolenaar89445512022-04-14 12:58:23 +0100745
746 unlet g:result
Bram Moolenaar648dd882022-04-14 21:36:15 +0100747 delete('XrelautoloadExport.vim')
Bram Moolenaar89445512022-04-14 12:58:23 +0100748 delete('Xmapscript.vim')
749 nunmap <F3>
Bram Moolenaard8448622022-01-07 21:39:52 +0000750enddef
751
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100752def Test_autoload_import_var()
753 # variable name starts with "autoload"
754 var lines =<< trim END
755 vim9script
756 var autoloaded = "Xtest.vim"
757 import autoloaded
758 END
759 v9.CheckScriptFailure(lines, 'E1053: Could not import "Xtest.vim')
760enddef
761
Bram Moolenaar648dd882022-04-14 21:36:15 +0100762def Test_use_autoload_import_in_mapping()
763 var lines =<< trim END
764 vim9script
765 export def Func()
766 g:result = 49
767 enddef
768 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100769 mkdir('Ximpdir/autoload', 'p')
770 writefile(lines, 'Ximpdir/autoload/XautoloadExport.vim')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100771 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100772 exe 'set rtp^=' .. getcwd() .. '/Ximpdir'
Bram Moolenaar648dd882022-04-14 21:36:15 +0100773
774 lines =<< trim END
775 vim9script
776 import autoload 'XautoloadExport.vim' as some
777 nnoremap <F3> :call <SID>some.Func()<CR>
778 END
779 writefile(lines, 'Xmapscript.vim')
780
781 source Xmapscript.vim
782 assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
783 feedkeys("\<F3>", "xt")
784 assert_equal(49, g:result)
785
786 unlet g:result
787 delete('Xmapscript.vim')
788 nunmap <F3>
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100789 delete('Ximpdir', 'rf')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100790 &rtp = save_rtp
791enddef
792
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000793def Test_use_import_in_command_completion()
Bram Moolenaar15d16352022-01-17 20:09:08 +0000794 var lines =<< trim END
795 vim9script
796 export def Complete(..._): list<string>
797 return ['abcd']
798 enddef
799 END
800 writefile(lines, 'Xscript.vim')
801
802 lines =<< trim END
803 vim9script
804 import './Xscript.vim'
805
806 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
807 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
808 assert_equal('#Cmd abcd', @:)
809 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000810 v9.CheckScriptSuccess(lines)
Bram Moolenaar15d16352022-01-17 20:09:08 +0000811
812 delcommand Cmd
813 delete('Xscript.vim')
814enddef
815
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100816def Test_use_import_with_funcref_in_command_completion()
817 var lines =<< trim END
818 vim9script
819 export def Complete(..._): list<string>
820 return ['abcd']
821 enddef
822 END
823 writefile(lines, 'Xscript.vim')
824
825 lines =<< trim END
826 vim9script
827 import './Xscript.vim'
828
829 var Ref = Xscript.Complete
830 exe "command -nargs=1 -complete=customlist," .. expand('<SID>') .. "Ref Cmd echo 'ok'"
831 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
832 assert_equal('#Cmd abcd', @:)
833 END
834 v9.CheckScriptSuccess(lines)
835
836 delcommand Cmd
837 delete('Xscript.vim')
838enddef
839
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000840def Test_use_autoload_import_in_insert_completion()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100841 mkdir('Xinsdir/autoload', 'p')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000842 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100843 exe 'set rtp^=' .. getcwd() .. '/Xinsdir'
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000844
845 var lines =<< trim END
846 vim9script
847 export def ThesaurusFunc(findbase: bool, _): any
848 if findbase
849 return 1
850 endif
851 return [
852 'check',
853 'experiment',
854 'test',
855 'verification'
856 ]
857 enddef
858 g:completion_loaded = 'yes'
859 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100860 writefile(lines, 'Xinsdir/autoload/completion.vim')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000861
862 new
863 lines =<< trim END
864 vim9script
865 g:completion_loaded = 'no'
866 import autoload 'completion.vim'
867 set thesaurusfunc=completion.ThesaurusFunc
868 assert_equal('no', g:completion_loaded)
869 feedkeys("i\<C-X>\<C-T>\<C-N>\<Esc>", 'xt')
870 assert_equal('experiment', getline(1))
871 assert_equal('yes', g:completion_loaded)
872 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000873 v9.CheckScriptSuccess(lines)
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000874
875 set thesaurusfunc=
876 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100877 delete('Xinsdir', 'rf')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000878 &rtp = save_rtp
879enddef
880
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000881def Test_use_autoload_import_partial_in_opfunc()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100882 mkdir('Xpartdir/autoload', 'p')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000883 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100884 exe 'set rtp^=' .. getcwd() .. '/Xpartdir'
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000885
886 var lines =<< trim END
887 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100888 export def Opfunc1(..._)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000889 g:opfunc_called = 'yes'
890 enddef
891 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100892 writefile(lines, 'Xpartdir/autoload/opfunc.vim')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000893
894 new
895 lines =<< trim END
896 vim9script
897 import autoload 'opfunc.vim'
898 nnoremap <expr> <F3> TheFunc()
899 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100900 &operatorfunc = function('opfunc.Opfunc1', [0])
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000901 return 'g@'
902 enddef
903 feedkeys("\<F3>l", 'xt')
904 assert_equal('yes', g:opfunc_called)
905 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000906 v9.CheckScriptSuccess(lines)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000907
908 set opfunc=
909 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100910 delete('Xpartdir', 'rf')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000911 nunmap <F3>
912 &rtp = save_rtp
913enddef
914
915def Test_set_opfunc_to_autoload_func_directly()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100916 mkdir('Xdirdir/autoload', 'p')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000917 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100918 exe 'set rtp^=' .. getcwd() .. '/Xdirdir'
Bram Moolenaar06b77222022-01-25 15:51:56 +0000919
920 var lines =<< trim END
921 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100922 export def Opfunc2(..._)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000923 g:opfunc_called = 'yes'
924 enddef
925 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100926 writefile(lines, 'Xdirdir/autoload/opfunc.vim')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000927
928 new
929 lines =<< trim END
930 vim9script
931 import autoload 'opfunc.vim'
932 nnoremap <expr> <F3> TheFunc()
933 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100934 &operatorfunc = opfunc.Opfunc2
Bram Moolenaar06b77222022-01-25 15:51:56 +0000935 return 'g@'
936 enddef
937 feedkeys("\<F3>l", 'xt')
938 assert_equal('yes', g:opfunc_called)
939 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000940 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000941
942 set opfunc=
943 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100944 delete('Xdirdir', 'rf')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000945 nunmap <F3>
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000946 &rtp = save_rtp
947enddef
948
Bram Moolenaare70dd112022-01-21 16:31:11 +0000949def Test_use_autoload_import_in_fold_expression()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100950 mkdir('Xfolddir/autoload', 'p')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000951 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100952 exe 'set rtp^=' .. getcwd() .. '/Xfolddir'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000953
954 var lines =<< trim END
955 vim9script
956 export def Expr(): string
957 return getline(v:lnum) =~ '^#' ? '>1' : '1'
958 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000959 export def Text(): string
960 return 'fold text'
961 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000962 g:fold_loaded = 'yes'
963 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100964 writefile(lines, 'Xfolddir/autoload/fold.vim')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000965
966 lines =<< trim END
967 vim9script
968 import autoload 'fold.vim'
969 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000970 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000971 &foldmethod = 'expr'
972 &debug = 'throw'
973 END
974 new
975 setline(1, ['# one', 'text', '# two', 'text'])
976 g:fold_loaded = 'no'
Bram Moolenaar62aec932022-01-29 21:45:34 +0000977 v9.CheckScriptSuccess(lines)
Bram Moolenaare70dd112022-01-21 16:31:11 +0000978 assert_equal('no', g:fold_loaded)
979 redraw
980 assert_equal('yes', g:fold_loaded)
981
982 # Check that script context of 'foldexpr' is copied to another buffer.
983 edit! otherfile
984 redraw
985
Bram Moolenaar9530b582022-01-22 13:39:08 +0000986 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +0000987 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100988 delete('Xfolddir', 'rf')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000989 &rtp = save_rtp
990enddef
991
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100992def Test_autoload_import_relative()
993 var lines =<< trim END
994 vim9script
995
996 g:loaded = 'yes'
997 export def RelFunc(): string
998 return 'relfunc'
999 enddef
1000 def NotExported()
1001 echo 'not'
1002 enddef
1003
1004 export var someText = 'some text'
1005 var notexp = 'bad'
1006 END
1007 writefile(lines, 'XimportRel.vim')
1008 writefile(lines, 'XimportRel2.vim')
1009 writefile(lines, 'XimportRel3.vim')
Bram Moolenaar10611952022-04-03 21:11:34 +01001010 writefile(lines, 'XimportRel4.vim')
1011 writefile(lines, 'XimportRel5.vim')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001012
1013 lines =<< trim END
1014 vim9script
1015 g:loaded = 'no'
1016 import autoload './XimportRel.vim'
1017 assert_equal('no', g:loaded)
1018
1019 def AFunc(): string
1020 var res = ''
1021 res ..= XimportRel.RelFunc()
1022 res ..= '/'
1023 res ..= XimportRel.someText
1024 XimportRel.someText = 'from AFunc'
1025 return res
1026 enddef
1027 # script not loaded when compiling
1028 defcompile
1029 assert_equal('no', g:loaded)
1030
1031 assert_equal('relfunc/some text', AFunc())
1032 assert_equal('yes', g:loaded)
1033 unlet g:loaded
1034
1035 assert_equal('from AFunc', XimportRel.someText)
1036 XimportRel.someText = 'from script'
1037 assert_equal('from script', XimportRel.someText)
1038 END
1039 v9.CheckScriptSuccess(lines)
1040
1041 lines =<< trim END
1042 vim9script
1043 import autoload './XimportRel.vim'
1044 echo XimportRel.NotExported()
1045 END
1046 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 3)
1047
1048 lines =<< trim END
1049 vim9script
1050 import autoload './XimportRel.vim'
1051 echo XimportRel.notexp
1052 END
1053 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1054
1055 lines =<< trim END
1056 vim9script
1057 import autoload './XimportRel.vim'
1058 XimportRel.notexp = 'bad'
1059 END
1060 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1061
1062 lines =<< trim END
1063 vim9script
1064 import autoload './XimportRel.vim'
1065 def Func()
1066 echo XimportRel.NotExported()
1067 enddef
1068 Func()
1069 END
1070 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 1)
1071
1072 lines =<< trim END
1073 vim9script
1074 import autoload './XimportRel.vim'
1075 def Func()
1076 echo XimportRel.notexp
1077 enddef
1078 Func()
1079 END
1080 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1081
Bram Moolenaar10611952022-04-03 21:11:34 +01001082 # Same, script not imported before
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001083 lines =<< trim END
1084 vim9script
Bram Moolenaar10611952022-04-03 21:11:34 +01001085 import autoload './XimportRel4.vim'
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001086 def Func()
Bram Moolenaar10611952022-04-03 21:11:34 +01001087 echo XimportRel4.notexp
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001088 enddef
1089 Func()
1090 END
1091 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1092
Bram Moolenaar10611952022-04-03 21:11:34 +01001093 # does not fail if the script wasn't loaded yet and only compiling
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001094 g:loaded = 'no'
1095 lines =<< trim END
1096 vim9script
1097 import autoload './XimportRel2.vim'
1098 def Func()
1099 echo XimportRel2.notexp
1100 enddef
1101 defcompile
1102 END
1103 v9.CheckScriptSuccess(lines)
1104 assert_equal('no', g:loaded)
1105
Bram Moolenaar10611952022-04-03 21:11:34 +01001106 lines =<< trim END
1107 vim9script
1108 import autoload './XimportRel.vim'
1109 def Func()
1110 XimportRel.notexp = 'bad'
1111 enddef
1112 Func()
1113 END
1114 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1115
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001116 # fails with a not loaded import
1117 lines =<< trim END
1118 vim9script
1119 import autoload './XimportRel3.vim'
1120 def Func()
1121 XimportRel3.notexp = 'bad'
1122 enddef
1123 Func()
1124 END
1125 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1126 assert_equal('yes', g:loaded)
1127 unlet g:loaded
1128
Bram Moolenaar10611952022-04-03 21:11:34 +01001129 lines =<< trim END
1130 vim9script
1131 import autoload './XimportRel5.vim'
1132 def Func()
1133 XimportRel5.nosuchvar = 'bad'
1134 enddef
1135 Func()
1136 END
1137 v9.CheckScriptFailure(lines, 'E121: Undefined variable: nosuchvar', 1)
1138 unlet g:loaded
1139
1140 # nasty: delete script after compiling function
1141 writefile(['vim9script'], 'XimportRelDel.vim')
1142 lines =<< trim END
1143 vim9script
1144
1145 import autoload './XimportRelDel.vim'
1146 def DoIt()
1147 echo XimportRelDel.var
1148 enddef
1149 defcompile
1150 delete('XimportRelDel.vim')
1151 DoIt()
1152 END
Bram Moolenaar242c1522022-04-03 21:52:51 +01001153 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaar10611952022-04-03 21:11:34 +01001154
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001155 delete('XimportRel.vim')
1156 delete('XimportRel2.vim')
1157 delete('XimportRel3.vim')
Bram Moolenaar10611952022-04-03 21:11:34 +01001158 delete('XimportRel4.vim')
1159 delete('XimportRel5.vim')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001160enddef
1161
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001162def Test_autoload_import_relative_autoload_dir()
1163 mkdir('autoload', 'p')
1164 var lines =<< trim END
1165 vim9script
1166 export def Bar()
1167 g:called_bar = 'yes'
1168 enddef
1169 END
1170 writefile(lines, 'autoload/script.vim')
1171
1172 lines =<< trim END
1173 vim9script
1174 import autoload './autoload/script.vim'
1175 def Foo()
1176 script.Bar()
1177 enddef
1178 Foo()
1179 assert_equal('yes', g:called_bar)
1180 END
1181 v9.CheckScriptSuccess(lines)
1182
1183 unlet g:called_bar
1184 delete('autoload', 'rf')
1185enddef
1186
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001187def Test_autoload_import_deleted()
1188 var lines =<< trim END
1189 vim9script
1190 export const FOO = 1
1191 END
1192 writefile(lines, 'Xa.vim')
1193
1194 lines =<< trim END
1195 vim9script
1196 import autoload './Xa.vim'
1197
1198 delete('Xa.vim')
1199 var x = Xa.FOO
1200 END
1201 v9.CheckScriptFailure(lines, 'E484:')
1202
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001203 delete('Xa.vim')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001204enddef
1205
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001206func Test_import_in_diffexpr()
1207 CheckExecutable diff
1208
1209 call Run_Test_import_in_diffexpr()
1210endfunc
1211
1212def Run_Test_import_in_diffexpr()
1213 var lines =<< trim END
1214 vim9script
1215
1216 export def DiffExpr()
1217 # Prepend some text to check diff type detection
1218 writefile(['warning', ' message'], v:fname_out)
1219 silent exe '!diff ' .. v:fname_in .. ' '
1220 .. v:fname_new .. '>>' .. v:fname_out
1221 enddef
1222 END
1223 writefile(lines, 'Xdiffexpr')
1224
1225 lines =<< trim END
1226 vim9script
1227 import './Xdiffexpr' as diff
1228
1229 set diffexpr=diff.DiffExpr()
1230 set diffopt=foldcolumn:0
1231 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001232 v9.CheckScriptSuccess(lines)
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001233
1234 enew!
1235 call setline(1, ['one', 'two', 'three'])
1236 diffthis
1237
1238 botright vert new
1239 call setline(1, ['one', 'two', 'three.'])
1240 diffthis
1241 # we only check if this does not cause errors
1242 redraw
1243
1244 diffoff!
Bram Moolenaar50761872022-06-26 18:01:00 +01001245 set diffexpr=
1246 set diffopt&
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001247 bwipe!
1248 bwipe!
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00001249 delete('Xdiffexpr')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001250enddef
1251
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001252def Test_import_in_patchexpr()
1253 var lines =<< trim END
1254 vim9script
1255 export def TPatch()
1256 call writefile(['output file'], v:fname_out)
1257 enddef
1258 END
1259 writefile(lines, 'Xpatchexpr')
1260
1261 lines =<< trim END
1262 vim9script
1263 import './Xpatchexpr' as patch
1264 set patchexpr=patch.TPatch()
1265 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001266 v9.CheckScriptSuccess(lines)
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001267
1268 call writefile(['input file'], 'Xinput')
1269 call writefile(['diff file'], 'Xdiff')
1270 :%bwipe!
1271 edit Xinput
1272 diffpatch Xdiff
1273 call assert_equal('output file', getline(1))
1274
1275 call delete('Xinput')
1276 call delete('Xdiff')
1277 call delete('Xpatchexpr')
1278 set patchexpr&
1279 :%bwipe!
1280enddef
1281
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001282def Test_import_in_formatexpr()
1283 var lines =<< trim END
1284 vim9script
1285 export def MyFormatExpr(): number
1286 g:did_format = 'yes'
1287 return 0
1288 enddef
1289 END
1290 writefile(lines, 'Xformatter')
1291
1292 lines =<< trim END
1293 vim9script
1294 import './Xformatter' as format
1295 set formatexpr=format.MyFormatExpr()
1296 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001297 v9.CheckScriptSuccess(lines)
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001298
1299 new
1300 setline(1, ['a', 'b', 'c'])
1301 normal gqG
1302 assert_equal('yes', g:did_format)
1303
1304 bwipe!
1305 delete('Xformatter')
1306 unlet g:did_format
1307 set formatexpr=
1308enddef
1309
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001310def Test_import_in_includeexpr()
1311 writefile(['found it'], 'Xthisfile')
1312 new
1313
1314 var lines =<< trim END
1315 vim9script
1316 export def DoSub(): string
1317 return substitute(v:fname, 'that', 'this', '')
1318 enddef
1319 END
1320 writefile(lines, 'Xinclude.vim')
1321
1322 lines =<< trim END
1323 vim9script
1324 import './Xinclude.vim'
1325 set includeexpr=Xinclude.DoSub()
1326 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001327 v9.CheckScriptSuccess(lines)
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001328
1329 setline(1, ['Xthatfile'])
1330 exe "normal \<C-W>f"
1331 assert_equal('Xthisfile', expand('%'))
1332
1333 bwipe!
1334 bwipe!
1335 set includeexpr=
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00001336 delete('Xinclude.vim')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001337 delete('Xthisfile')
1338enddef
1339
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001340def Test_import_in_indentexpr()
1341 var lines =<< trim END
1342 vim9script
1343 export def GetIndent(): number
1344 return 5
1345 enddef
1346 END
1347 writefile(lines, 'Xindenter')
1348
1349 lines =<< trim END
1350 vim9script
1351 import './Xindenter' as indent
1352 set indentexpr=indent.GetIndent()
1353 set debug=throw
1354 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001355 v9.CheckScriptSuccess(lines)
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001356
1357 new
1358 setline(1, 'hello')
1359 normal ==
1360 assert_equal(' hello', getline(1))
1361
1362 bwipe!
1363 set indentexpr= debug=
1364 delete('Xindenter')
1365enddef
1366
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001367func Test_import_in_printexpr()
1368 CheckFeature postscript
1369 call Run_Test_import_in_printexpr()
1370endfunc
1371
1372def Run_Test_import_in_printexpr()
1373 var lines =<< trim END
1374 vim9script
1375 export def PrintFile(): bool
1376 g:printed = 'yes'
1377 delete('v:fname_in')
1378 return false
1379 enddef
1380 END
1381 writefile(lines, 'Xprint.vim')
1382
1383 lines =<< trim END
1384 vim9script
1385 import './Xprint.vim'
1386 set printexpr=Xprint.PrintFile()
1387 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001388 v9.CheckScriptSuccess(lines)
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001389
1390 help
1391 hardcopy dummy args
1392 assert_equal('yes', g:printed)
1393
1394 delete('Xprint.vim')
1395 set printexpr=
1396enddef
1397
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001398def Test_import_in_charconvert()
1399 var lines =<< trim END
1400 vim9script
1401 export def MakeUpper(): bool
1402 var data = readfile(v:fname_in)
1403 map(data, 'toupper(v:val)')
1404 writefile(data, v:fname_out)
1405 return false # success
1406 enddef
1407 END
1408 writefile(lines, 'Xconvert.vim')
1409
1410 lines =<< trim END
1411 vim9script
1412 import './Xconvert.vim' as conv
1413 set charconvert=conv.MakeUpper()
1414 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001415 v9.CheckScriptSuccess(lines)
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001416
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001417 writefile(['one', 'two'], 'Xiicfile')
1418 new Xiicfile
1419 write ++enc=ucase Xiicfile1
1420 assert_equal(['ONE', 'TWO'], readfile('Xiicfile1'))
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001421
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001422 delete('Xiicfile')
1423 delete('Xiicfile1')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001424 delete('Xconvert.vim')
1425 bwipe!
1426 set charconvert&
1427enddef
1428
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001429func Test_import_in_spellsuggest_expr()
1430 CheckFeature spell
1431 call Run_Test_import_in_spellsuggest_expr()
1432endfunc
1433
1434def Run_Test_import_in_spellsuggest_expr()
1435 var lines =<< trim END
1436 vim9script
1437 export def MySuggest(): list<any>
1438 return [['Fox', 8], ['Fop', 9]]
1439 enddef
1440 END
1441 writefile(lines, 'Xsuggest.vim')
1442
1443 lines =<< trim END
1444 vim9script
1445 import './Xsuggest.vim' as sugg
1446 set spell spellsuggest=expr:sugg.MySuggest()
1447 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001448 v9.CheckScriptSuccess(lines)
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001449
1450 set verbose=1 # report errors
1451 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
1452
1453 delete('Xsuggest.vim')
1454 set nospell spellsuggest& verbose=0
1455enddef
1456
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001457def Test_import_in_lambda_method()
1458 var lines =<< trim END
1459 vim9script
1460 export def Retarg(e: any): any
1461 return e
1462 enddef
1463 END
1464 writefile(lines, 'XexportRetarg.vim')
1465 lines =<< trim END
1466 vim9script
1467 import './XexportRetarg.vim'
1468 def Lambda(): string
1469 var F = (x) => x->XexportRetarg.Retarg()
1470 return F('arg')
1471 enddef
1472 assert_equal('arg', Lambda())
1473 END
1474 v9.CheckScriptSuccess(lines)
1475
1476 delete('XexportRetarg.vim')
1477enddef
1478
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001479def Test_export_shadows_global_function()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001480 mkdir('Xglobdir/autoload', 'p')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001481 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001482 exe 'set rtp^=' .. getcwd() .. '/Xglobdir'
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001483
1484 var lines =<< trim END
1485 vim9script
1486 export def Shadow(): string
1487 return 'Shadow()'
1488 enddef
1489 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001490 writefile(lines, 'Xglobdir/autoload/shadow.vim')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001491
1492 lines =<< trim END
1493 vim9script
1494
1495 def g:Shadow(): string
1496 return 'global'
1497 enddef
1498
1499 import autoload 'shadow.vim'
1500 assert_equal('Shadow()', shadow.Shadow())
1501 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001502 v9.CheckScriptSuccess(lines)
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001503
1504 delfunc g:Shadow
1505 bwipe!
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001506 delete('Xglobdir', 'rf')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001507 &rtp = save_rtp
1508enddef
1509
Bram Moolenaard8448622022-01-07 21:39:52 +00001510def Test_export_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001511 v9.CheckScriptFailure(['export var some = 123'], 'E1042:')
1512 v9.CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1513 v9.CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01001514 v9.CheckScriptFailure(['vim9script', 'export function /a1b2c3'], 'E1044:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001515
1516 assert_fails('export something', 'E1043:')
1517enddef
1518
1519func Test_import_fails_without_script()
1520 CheckRunVimInTerminal
1521
1522 " call indirectly to avoid compilation error for missing functions
1523 call Run_Test_import_fails_on_command_line()
1524endfunc
1525
1526def Run_Test_import_fails_on_command_line()
1527 var export =<< trim END
1528 vim9script
1529 export def Foo(): number
1530 return 0
1531 enddef
1532 END
1533 writefile(export, 'XexportCmd.vim')
1534
Bram Moolenaar62aec932022-01-29 21:45:34 +00001535 var buf = g:RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaard8448622022-01-07 21:39:52 +00001536 rows: 6, wait_for_ruler: 0})
Bram Moolenaar62aec932022-01-29 21:45:34 +00001537 g:WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaard8448622022-01-07 21:39:52 +00001538
1539 delete('XexportCmd.vim')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001540 g:StopVimInTerminal(buf)
Bram Moolenaard8448622022-01-07 21:39:52 +00001541enddef
1542
1543def Test_vim9_reload_noclear()
1544 var lines =<< trim END
1545 vim9script
1546 export var exported = 'thexport'
1547
1548 export def TheFunc(x = 0)
1549 enddef
1550 END
1551 writefile(lines, 'XExportReload')
1552 lines =<< trim END
1553 vim9script noclear
1554 g:loadCount += 1
Bram Moolenaara749a422022-02-12 19:52:25 +00001555 var reloaded = 'init'
Bram Moolenaard8448622022-01-07 21:39:52 +00001556 import './XExportReload' as exp
1557
1558 def Again(): string
1559 return 'again'
1560 enddef
1561
1562 exp.TheFunc()
1563
Bram Moolenaara749a422022-02-12 19:52:25 +00001564 if exists('loaded') | finish | endif
1565 var loaded = true
Bram Moolenaard8448622022-01-07 21:39:52 +00001566
Bram Moolenaara749a422022-02-12 19:52:25 +00001567 var notReloaded = 'yes'
1568 reloaded = 'first'
Bram Moolenaard8448622022-01-07 21:39:52 +00001569 def g:Values(): list<string>
Bram Moolenaara749a422022-02-12 19:52:25 +00001570 return [reloaded, notReloaded, Again(), Once(), exp.exported]
Bram Moolenaard8448622022-01-07 21:39:52 +00001571 enddef
1572
1573 def Once(): string
1574 return 'once'
1575 enddef
1576 END
1577 writefile(lines, 'XReloaded')
1578 g:loadCount = 0
1579 source XReloaded
1580 assert_equal(1, g:loadCount)
1581 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1582 source XReloaded
1583 assert_equal(2, g:loadCount)
1584 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1585 source XReloaded
1586 assert_equal(3, g:loadCount)
1587 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1588
1589 delete('XReloaded')
1590 delete('XExportReload')
1591 delfunc g:Values
1592 unlet g:loadCount
1593
1594 lines =<< trim END
1595 vim9script
1596 def Inner()
1597 enddef
1598 END
1599 lines->writefile('XreloadScript.vim')
1600 source XreloadScript.vim
1601
1602 lines =<< trim END
1603 vim9script
1604 def Outer()
1605 def Inner()
1606 enddef
1607 enddef
1608 defcompile
1609 END
1610 lines->writefile('XreloadScript.vim')
1611 source XreloadScript.vim
1612
1613 delete('XreloadScript.vim')
1614enddef
1615
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001616def Test_vim_reload_noclear_arg_count()
1617 var lines =<< trim END
1618 vim9script noclear
1619
1620 if !exists('g:didload')
1621 def Test(a: string, b: string)
1622 echo a b
1623 enddef
1624 def Call()
1625 Test('a', 'b')
1626 enddef
1627 else
1628 # redefine with one argument less
1629 def Test(a: string)
1630 echo a
1631 enddef
1632 endif
1633 Call()
1634 g:didload = 1
1635 END
1636 lines->writefile('XreloadScript_1.vim')
1637 source XreloadScript_1.vim
1638 assert_fails('source XreloadScript_1.vim', 'E1106: One argument too many')
1639 unlet g:didload
1640
1641 lines =<< trim END
1642 vim9script noclear
1643
1644 if !exists('g:didload')
1645 def Test(a: string, b: string, c: string)
1646 echo a b
1647 enddef
1648 def Call()
1649 Test('a', 'b', 'c')
1650 enddef
1651 else
1652 # redefine with one argument less
1653 def Test(a: string)
1654 echo a
1655 enddef
1656 endif
1657 Call()
1658 g:didload = 1
1659 END
1660 lines->writefile('XreloadScript_2.vim')
1661 source XreloadScript_2.vim
1662 assert_fails('source XreloadScript_2.vim', 'E1106: 2 arguments too many')
1663 unlet g:didload
1664
1665 lines =<< trim END
1666 vim9script noclear
1667
1668 if !exists('g:didload')
1669 def Test(a: string)
1670 echo a
1671 enddef
1672 def Call()
1673 Test('a')
1674 enddef
1675 else
1676 # redefine with one argument extra
1677 def Test(a: string, b: string)
1678 echo a b
1679 enddef
1680 endif
1681 Call()
1682 g:didload = 1
1683 END
1684 lines->writefile('XreloadScript_3.vim')
1685 source XreloadScript_3.vim
1686 assert_fails('source XreloadScript_3.vim', 'E1190: One argument too few')
1687 unlet g:didload
1688
1689 lines =<< trim END
1690 vim9script noclear
1691
1692 if !exists('g:didload')
1693 def Test(a: string)
1694 echo a
1695 enddef
1696 def Call()
1697 Test('a')
1698 enddef
1699 else
1700 # redefine with two arguments extra
1701 def Test(a: string, b: string, c: string)
1702 echo a b
1703 enddef
1704 endif
1705 Call()
1706 g:didload = 1
1707 END
1708 lines->writefile('XreloadScript_4.vim')
1709 source XreloadScript_4.vim
1710 assert_fails('source XreloadScript_4.vim', 'E1190: 2 arguments too few')
1711 unlet g:didload
1712
1713 delete('XreloadScript_1.vim')
1714 delete('XreloadScript_2.vim')
1715 delete('XreloadScript_3.vim')
1716 delete('XreloadScript_4.vim')
1717enddef
1718
1719def Test_vim9_reload_noclear_error()
1720 var lines =<< trim END
1721 vim9script noclear
1722
1723 if !exists('g:didload')
1724 def Test(a: string)
1725 echo a
1726 enddef
1727 def Call()
1728 Test('a')
1729 enddef
1730 else
1731 # redefine with a compile error
1732 def Test(a: string)
1733 echo ax
1734 enddef
1735 endif
1736 Call()
1737 g:didload = 1
1738 END
1739 lines->writefile('XreloadScriptErr.vim')
1740 source XreloadScriptErr.vim
1741 assert_fails('source XreloadScriptErr.vim', 'E1001: Variable not found: ax')
1742
1743 unlet g:didload
1744 delete('XreloadScriptErr.vim')
1745enddef
1746
Bram Moolenaard8448622022-01-07 21:39:52 +00001747def Test_vim9_reload_import()
1748 var lines =<< trim END
1749 vim9script
1750 const var = ''
1751 var valone = 1234
1752 def MyFunc(arg: string)
1753 valone = 5678
1754 enddef
1755 END
1756 var morelines =<< trim END
1757 var valtwo = 222
1758 export def GetValtwo(): number
1759 return valtwo
1760 enddef
1761 END
1762 writefile(lines + morelines, 'Xreload.vim')
1763 source Xreload.vim
1764 source Xreload.vim
1765 source Xreload.vim
1766
1767 # cannot declare a var twice
1768 lines =<< trim END
1769 vim9script
1770 var valone = 1234
1771 var valone = 5678
1772 END
1773 writefile(lines, 'Xreload.vim')
1774 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1775
1776 delete('Xreload.vim')
1777 delete('Ximport.vim')
1778enddef
1779
1780" if a script is reloaded with a script-local variable that changed its type, a
1781" compiled function using that variable must fail.
1782def Test_script_reload_change_type()
1783 var lines =<< trim END
1784 vim9script noclear
1785 var str = 'string'
1786 def g:GetStr(): string
1787 return str .. 'xxx'
1788 enddef
1789 END
1790 writefile(lines, 'Xreload.vim')
1791 source Xreload.vim
1792 echo g:GetStr()
1793
1794 lines =<< trim END
1795 vim9script noclear
1796 var str = 1234
1797 END
1798 writefile(lines, 'Xreload.vim')
1799 source Xreload.vim
1800 assert_fails('echo g:GetStr()', 'E1150:')
1801
1802 delfunc g:GetStr
1803 delete('Xreload.vim')
1804enddef
1805
1806" Define CallFunc so that the test can be compiled
1807command CallFunc echo 'nop'
1808
1809def Test_script_reload_from_function()
1810 var lines =<< trim END
1811 vim9script
1812
Bram Moolenaar10611952022-04-03 21:11:34 +01001813 if exists('g:loadedThis')
Bram Moolenaard8448622022-01-07 21:39:52 +00001814 finish
1815 endif
Bram Moolenaar10611952022-04-03 21:11:34 +01001816 g:loadedThis = 1
Bram Moolenaard8448622022-01-07 21:39:52 +00001817 delcommand CallFunc
1818 command CallFunc Func()
1819 def Func()
1820 so XreloadFunc.vim
1821 g:didTheFunc = 1
1822 enddef
1823 END
1824 writefile(lines, 'XreloadFunc.vim')
1825 source XreloadFunc.vim
1826 CallFunc
1827 assert_equal(1, g:didTheFunc)
1828
1829 delete('XreloadFunc.vim')
1830 delcommand CallFunc
Bram Moolenaar10611952022-04-03 21:11:34 +01001831 unlet g:loadedThis
Bram Moolenaard8448622022-01-07 21:39:52 +00001832 unlet g:didTheFunc
1833enddef
1834
1835def s:RetSome(): string
1836 return 'some'
1837enddef
1838
1839" Not exported function that is referenced needs to be accessed by the
1840" script-local name.
1841def Test_vim9_funcref()
1842 var sortlines =<< trim END
1843 vim9script
1844 def Compare(i1: number, i2: number): number
1845 return i2 - i1
1846 enddef
1847
1848 export def FastSort(): list<number>
1849 return range(5)->sort(Compare)
1850 enddef
1851
1852 export def GetString(arg: string): string
1853 return arg
1854 enddef
1855 END
1856 writefile(sortlines, 'Xsort.vim')
1857
1858 var lines =<< trim END
1859 vim9script
1860 import './Xsort.vim'
1861 def Test()
1862 g:result = Xsort.FastSort()
1863 enddef
1864 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001865 END
1866 writefile(lines, 'Xscript.vim')
1867 source Xscript.vim
1868 assert_equal([4, 3, 2, 1, 0], g:result)
1869 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00001870
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001871 lines =<< trim END
1872 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00001873 # using a function imported with "as"
1874 import './Xsort.vim' as anAlias
1875 assert_equal('yes', anAlias.GetString('yes'))
1876
1877 # using the function from a compiled function
1878 def TestMore(): string
1879 var s = s:anAlias.GetString('foo')
1880 return s .. anAlias.GetString('bar')
1881 enddef
1882 assert_equal('foobar', TestMore())
1883
1884 # error when using a function that isn't exported
1885 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1886 END
1887 writefile(lines, 'Xscript.vim')
1888
Bram Moolenaard8448622022-01-07 21:39:52 +00001889 delete('Xsort.vim')
1890 delete('Xscript.vim')
1891
1892 var Funcref = function('s:RetSome')
1893 assert_equal('some', Funcref())
1894enddef
1895
1896" Check that when searching for "FilterFunc" it finds the import in the
1897" script where FastFilter() is called from, both as a string and as a direct
1898" function reference.
1899def Test_vim9_funcref_other_script()
1900 var filterLines =<< trim END
1901 vim9script
1902 export def FilterFunc(idx: number, val: number): bool
1903 return idx % 2 == 1
1904 enddef
1905 export def FastFilter(): list<number>
1906 return range(10)->filter('FilterFunc(v:key, v:val)')
1907 enddef
1908 export def FastFilterDirect(): list<number>
1909 return range(10)->filter(FilterFunc)
1910 enddef
1911 END
1912 writefile(filterLines, 'Xfilter.vim')
1913
1914 var lines =<< trim END
1915 vim9script
1916 import './Xfilter.vim' as filter
1917 def Test()
1918 var x: list<number> = filter.FastFilter()
1919 enddef
1920 Test()
1921 def TestDirect()
1922 var x: list<number> = filter.FastFilterDirect()
1923 enddef
1924 TestDirect()
1925 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001926 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +00001927 delete('Xfilter.vim')
1928enddef
1929
1930def Test_import_absolute()
1931 var import_lines = [
1932 'vim9script',
1933 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
1934 'def UseExported()',
1935 ' g:imported_abs = abs.exported',
1936 ' abs.exported = 8888',
1937 ' g:imported_after = abs.exported',
1938 'enddef',
1939 'UseExported()',
1940 'g:import_disassembled = execute("disass UseExported")',
1941 ]
1942 writefile(import_lines, 'Ximport_abs.vim')
1943 writefile(s:export_script_lines, 'Xexport_abs.vim')
1944
1945 source Ximport_abs.vim
1946
1947 assert_equal(9876, g:imported_abs)
1948 assert_equal(8888, g:imported_after)
1949 assert_match('<SNR>\d\+_UseExported\_s*' ..
1950 'g:imported_abs = abs.exported\_s*' ..
1951 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1952 '1 STOREG g:imported_abs\_s*' ..
1953 'abs.exported = 8888\_s*' ..
1954 '2 PUSHNR 8888\_s*' ..
1955 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1956 'g:imported_after = abs.exported\_s*' ..
1957 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1958 '5 STOREG g:imported_after',
1959 g:import_disassembled)
1960
1961 Undo_export_script_lines()
1962 unlet g:imported_abs
1963 unlet g:import_disassembled
1964
1965 delete('Ximport_abs.vim')
1966 delete('Xexport_abs.vim')
1967enddef
1968
1969def Test_import_rtp()
1970 var import_lines = [
1971 'vim9script',
1972 'import "Xexport_rtp.vim" as rtp',
1973 'g:imported_rtp = rtp.exported',
1974 ]
1975 writefile(import_lines, 'Ximport_rtp.vim')
1976 mkdir('import', 'p')
1977 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1978
1979 var save_rtp = &rtp
1980 &rtp = getcwd()
1981 source Ximport_rtp.vim
1982 &rtp = save_rtp
1983
1984 assert_equal(9876, g:imported_rtp)
1985
1986 Undo_export_script_lines()
1987 unlet g:imported_rtp
1988 delete('Ximport_rtp.vim')
1989 delete('import', 'rf')
1990enddef
1991
1992def Test_import_compile_error()
1993 var export_lines = [
1994 'vim9script',
1995 'export def ExpFunc(): string',
1996 ' return notDefined',
1997 'enddef',
1998 ]
1999 writefile(export_lines, 'Xexported.vim')
2000
2001 var import_lines = [
2002 'vim9script',
2003 'import "./Xexported.vim" as expo',
2004 'def ImpFunc()',
2005 ' echo expo.ExpFunc()',
2006 'enddef',
2007 'defcompile',
2008 ]
2009 writefile(import_lines, 'Ximport.vim')
2010
2011 try
2012 source Ximport.vim
2013 catch /E1001/
2014 # Error should be before the Xexported.vim file.
2015 assert_match('E1001: Variable not found: notDefined', v:exception)
2016 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
2017 endtry
2018
2019 delete('Xexported.vim')
2020 delete('Ximport.vim')
2021enddef
2022
2023def Test_func_overrules_import_fails()
2024 var export_lines =<< trim END
2025 vim9script
2026 export def Func()
2027 echo 'imported'
2028 enddef
2029 END
2030 writefile(export_lines, 'XexportedFunc.vim')
2031
2032 var lines =<< trim END
2033 vim9script
2034 import './XexportedFunc.vim' as Func
2035 def Func()
2036 echo 'local to function'
2037 enddef
2038 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002039 v9.CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00002040
2041 lines =<< trim END
2042 vim9script
2043 import './XexportedFunc.vim' as Func
2044 def Outer()
2045 def Func()
2046 echo 'local to function'
2047 enddef
2048 enddef
2049 defcompile
2050 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002051 v9.CheckScriptFailure(lines, 'E1236:')
Bram Moolenaard8448622022-01-07 21:39:52 +00002052
2053 delete('XexportedFunc.vim')
2054enddef
2055
2056def Test_source_vim9_from_legacy()
2057 var vim9_lines =<< trim END
2058 vim9script
2059 var local = 'local'
2060 g:global = 'global'
2061 export var exported = 'exported'
2062 export def GetText(): string
2063 return 'text'
2064 enddef
2065 END
2066 writefile(vim9_lines, 'Xvim9_script.vim')
2067
2068 var legacy_lines =<< trim END
2069 source Xvim9_script.vim
2070
2071 call assert_false(exists('local'))
2072 call assert_false(exists('exported'))
2073 call assert_false(exists('s:exported'))
2074 call assert_equal('global', global)
2075 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00002076 END
2077 writefile(legacy_lines, 'Xlegacy_script.vim')
2078
2079 source Xlegacy_script.vim
2080 assert_equal('global', g:global)
2081 unlet g:global
2082
2083 delete('Xlegacy_script.vim')
2084 delete('Xvim9_script.vim')
2085enddef
2086
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002087def Test_import_vim9_from_legacy()
2088 var vim9_lines =<< trim END
2089 vim9script
2090 var local = 'local'
2091 g:global = 'global'
2092 export var exported = 'exported'
2093 export def GetText(): string
2094 return 'text'
2095 enddef
2096 END
2097 writefile(vim9_lines, 'Xvim9_export.vim')
2098
2099 var legacy_lines =<< trim END
2100 import './Xvim9_export.vim' as vim9
2101
2102 call assert_false(exists('vim9'))
2103 call assert_false(exists('local'))
2104 call assert_false(exists('s:vim9.local'))
2105 call assert_equal('global', global)
2106 call assert_equal('global', g:global)
2107 call assert_false(exists('exported'))
2108 call assert_false(exists('s:exported'))
2109 call assert_false(exists('*GetText'))
2110
2111 " imported symbol is script-local
2112 call assert_equal('exported', s:vim9.exported)
2113 call assert_equal('text', s:vim9.GetText())
2114 END
2115 writefile(legacy_lines, 'Xlegacy_script.vim')
2116
2117 source Xlegacy_script.vim
2118 assert_equal('global', g:global)
2119 unlet g:global
2120
2121 delete('Xlegacy_script.vim')
2122 delete('Xvim9_export.vim')
2123enddef
2124
Bram Moolenaard8448622022-01-07 21:39:52 +00002125def Test_cmdline_win()
2126 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
2127 # the command line window.
2128 mkdir('rtp/syntax', 'p')
2129 var export_lines =<< trim END
2130 vim9script
2131 export var That = 'yes'
2132 END
2133 writefile(export_lines, 'rtp/syntax/Xexport.vim')
2134 var import_lines =<< trim END
2135 vim9script
2136 import './Xexport.vim' as exp
2137 echo exp.That
2138 END
2139 writefile(import_lines, 'rtp/syntax/vim.vim')
2140 var save_rtp = &rtp
2141 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
2142 syntax on
2143 augroup CmdWin
2144 autocmd CmdwinEnter * g:got_there = 'yes'
2145 augroup END
2146 # this will open and also close the cmdline window
2147 feedkeys('q:', 'xt')
2148 assert_equal('yes', g:got_there)
2149
2150 augroup CmdWin
2151 au!
2152 augroup END
2153 &rtp = save_rtp
2154 delete('rtp', 'rf')
2155enddef
2156
2157def Test_import_gone_when_sourced_twice()
2158 var exportlines =<< trim END
2159 vim9script
2160 if exists('g:guard')
2161 finish
2162 endif
2163 g:guard = 1
2164 export var name = 'someName'
2165 END
2166 writefile(exportlines, 'XexportScript.vim')
2167
2168 var lines =<< trim END
2169 vim9script
2170 import './XexportScript.vim' as expo
2171 def g:GetName(): string
2172 return expo.name
2173 enddef
2174 END
2175 writefile(lines, 'XscriptImport.vim')
2176 so XscriptImport.vim
2177 assert_equal('someName', g:GetName())
2178
2179 so XexportScript.vim
2180 assert_fails('call g:GetName()', 'E1149:')
2181
2182 delfunc g:GetName
2183 delete('XexportScript.vim')
2184 delete('XscriptImport.vim')
2185 unlet g:guard
2186enddef
2187
Bram Moolenaar160aa862022-01-10 21:29:57 +00002188" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002189def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002190 var lines =<< trim END
2191 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002192 export def Gettest(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002193 return 'test'
2194 enddef
2195 g:some#name = 'name'
2196 g:some#dict = {key: 'value'}
2197
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002198 export def Varargs(a1: string, ...l: list<string>): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002199 return a1 .. l[0] .. l[1]
2200 enddef
2201 END
2202
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002203 mkdir('Xfulldir/autoload', 'p')
2204 writefile(lines, 'Xfulldir/autoload/some.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002205 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002206 exe 'set rtp^=' .. getcwd() .. '/Xfulldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002207
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002208 assert_equal('test', g:some#Gettest())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002209 assert_equal('name', g:some#name)
2210 assert_equal('value', g:some#dict.key)
2211 g:some#other = 'other'
2212 assert_equal('other', g:some#other)
2213
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002214 assert_equal('abc', some#Varargs('a', 'b', 'c'))
Bram Moolenaar160aa862022-01-10 21:29:57 +00002215
2216 # upper case script name works
2217 lines =<< trim END
2218 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002219 export def GetOther(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002220 return 'other'
2221 enddef
2222 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002223 writefile(lines, 'Xfulldir/autoload/Other.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002224 assert_equal('other', g:Other#GetOther())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002225
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002226 delete('Xfulldir', 'rf')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002227 &rtp = save_rtp
2228enddef
2229
2230def Test_vim9script_autoload()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002231 mkdir('Xaldir/autoload', 'p')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002232 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002233 exe 'set rtp^=' .. getcwd() .. '/Xaldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002234
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002235 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00002236 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002237 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002238 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00002239
2240 export def Gettest(): string
2241 return 'test'
2242 enddef
2243
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002244 export var name = 'name'
2245
2246 export func GetFunc()
2247 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00002248 endfunc
2249
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002250 export def GetDef(): string
2251 return Gettest() .. 'more' .. name
2252 enddef
2253
Bram Moolenaar160aa862022-01-10 21:29:57 +00002254 export final fname = 'final'
2255 export const cname = 'const'
2256 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002257 writefile(lines, 'Xaldir/autoload/prefixed.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002258
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002259 g:prefixed_loaded = 0
2260 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00002261 lines =<< trim END
2262 vim9script
2263 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002264 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002265 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002266 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002267
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002268 assert_equal('testmorename', prefixed.GetFunc())
2269 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002270 assert_equal('name', prefixed.name)
2271 assert_equal('final', prefixed.fname)
2272 assert_equal('const', prefixed.cname)
2273 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002274 v9.CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002275 # can source it again, autoload script not loaded again
2276 g:expected_loaded = 1
Bram Moolenaar62aec932022-01-29 21:45:34 +00002277 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002278
2279 # can also get the items by autoload name
2280 lines =<< trim END
2281 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002282 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002283 call assert_equal('name', prefixed#name)
2284 call assert_equal('final', prefixed#fname)
2285 call assert_equal('const', prefixed#cname)
2286 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002287 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002288
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002289 unlet g:prefixed_loaded
2290 unlet g:expected_loaded
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002291 delete('Xaldir', 'rf')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002292 &rtp = save_rtp
2293enddef
2294
Bram Moolenaard02dce22022-01-18 17:43:04 +00002295def Test_import_autoload_not_exported()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002296 mkdir('Xnimdir/autoload', 'p')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002297 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002298 exe 'set rtp^=' .. getcwd() .. '/Xnimdir'
Bram Moolenaard02dce22022-01-18 17:43:04 +00002299
2300 # error when using an item that is not exported from an autoload script
2301 var exportLines =<< trim END
2302 vim9script
2303 var notExported = 123
2304 def NotExport()
2305 echo 'nop'
2306 enddef
2307 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002308 writefile(exportLines, 'Xnimdir/autoload/notExport1.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002309
2310 var lines =<< trim END
2311 vim9script
2312 import autoload 'notExport1.vim'
2313 echo notExport1.notFound
2314 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002315 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002316
2317 lines =<< trim END
2318 vim9script
2319 import autoload 'notExport1.vim'
2320 echo notExport1.notExported
2321 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002322 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002323
2324 lines =<< trim END
2325 vim9script
2326 import autoload 'notExport1.vim'
2327 echo notExport1.NotFunc()
2328 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002329 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002330
2331 lines =<< trim END
2332 vim9script
2333 import autoload 'notExport1.vim'
2334 echo notExport1.NotExport()
2335 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002336 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002337
2338 lines =<< trim END
2339 vim9script
2340 import autoload 'notExport1.vim'
2341 echo 'text'->notExport1.NotFunc()
2342 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002343 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002344
2345 lines =<< trim END
2346 vim9script
2347 import autoload 'notExport1.vim'
2348 echo 'text'->notExport1.NotExport()
2349 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002350 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002351
2352 # using a :def function we use a different autoload script every time so that
2353 # the function is compiled without the script loaded
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002354 writefile(exportLines, 'Xnimdir/autoload/notExport2.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002355 lines =<< trim END
2356 vim9script
2357 import autoload 'notExport2.vim'
2358 def Testit()
2359 echo notExport2.notFound
2360 enddef
2361 Testit()
2362 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002363 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002364
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002365 writefile(exportLines, 'Xnimdir/autoload/notExport3.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002366 lines =<< trim END
2367 vim9script
2368 import autoload 'notExport3.vim'
2369 def Testit()
2370 echo notExport3.notExported
2371 enddef
2372 Testit()
2373 END
2374 # don't get E1049 because it is too complicated to figure out
Bram Moolenaar62aec932022-01-29 21:45:34 +00002375 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002376
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002377 writefile(exportLines, 'Xnimdir/autoload/notExport4.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002378 lines =<< trim END
2379 vim9script
2380 import autoload 'notExport4.vim'
2381 def Testit()
2382 echo notExport4.NotFunc()
2383 enddef
2384 Testit()
2385 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002386 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002387
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002388 writefile(exportLines, 'Xnimdir/autoload/notExport5.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002389 lines =<< trim END
2390 vim9script
2391 import autoload 'notExport5.vim'
2392 def Testit()
2393 echo notExport5.NotExport()
2394 enddef
2395 Testit()
2396 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002397 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002398
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002399 writefile(exportLines, 'Xnimdir/autoload/notExport6.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002400 lines =<< trim END
2401 vim9script
2402 import autoload 'notExport6.vim'
2403 def Testit()
2404 echo 'text'->notExport6.NotFunc()
2405 enddef
2406 Testit()
2407 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002408 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002409
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002410 writefile(exportLines, 'Xnimdir/autoload/notExport7.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002411 lines =<< trim END
2412 vim9script
2413 import autoload 'notExport7.vim'
2414 def Testit()
2415 echo 'text'->notExport7.NotExport()
2416 enddef
2417 Testit()
2418 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002419 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002420
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002421 delete('Xnimdir', 'rf')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002422 &rtp = save_rtp
2423enddef
2424
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002425def Test_vim9script_autoload_call()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002426 mkdir('Xcalldir/autoload', 'p')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002427 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002428 exe 'set rtp^=' .. getcwd() .. '/Xcalldir'
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002429
2430 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002431 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002432
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002433 export def RetArg(arg: string): string
2434 return arg
2435 enddef
2436
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002437 export def Getother()
2438 g:result = 'other'
2439 enddef
2440 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002441 writefile(lines, 'Xcalldir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002442
2443 lines =<< trim END
2444 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00002445 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002446
2447 # compile this before 'another.vim' is loaded
2448 def CallAnother()
2449 assert_equal('foo', 'foo'->another.RetArg())
2450 enddef
2451 CallAnother()
2452
Bram Moolenaar5d982692022-01-12 15:15:27 +00002453 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002454 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00002455
2456 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaar8164f6e2022-02-06 13:08:41 +00002457
2458 verbose function another.Getother
2459 # should we disallow this?
2460 verbose function another#Getother
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002461 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002462 v9.CheckScriptSuccess(lines)
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002463
2464 unlet g:result
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002465 delete('Xcalldir', 'rf')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002466 &rtp = save_rtp
2467enddef
2468
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002469def Test_vim9script_noclear_autoload()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002470 mkdir('Xnocdir/autoload', 'p')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002471 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002472 exe 'set rtp^=' .. getcwd() .. '/Xnocdir'
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002473
2474 var lines =<< trim END
2475 vim9script
2476 export def Func(): string
2477 return 'called'
2478 enddef
2479 g:double_loaded = 'yes'
2480 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002481 writefile(lines, 'Xnocdir/autoload/double.vim')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002482
2483 lines =<< trim END
2484 vim9script noclear
2485 if exists('g:script_loaded')
2486 finish
2487 endif
2488 g:script_loaded = true
2489
2490 import autoload 'double.vim'
2491 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
2492 END
2493 g:double_loaded = 'no'
2494 writefile(lines, 'Xloaddouble')
2495 source Xloaddouble
2496 assert_equal('no', g:double_loaded)
2497 assert_equal(true, g:script_loaded)
2498 source Xloaddouble
2499 feedkeys("\<F3>", 'xt')
2500 assert_equal('called', g:result)
2501 assert_equal('yes', g:double_loaded)
2502
2503 delete('Xloaddouble')
2504 unlet g:double_loaded
2505 unlet g:script_loaded
2506 unlet g:result
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002507 delete('Xnocdir', 'rf')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002508 &rtp = save_rtp
2509enddef
2510
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002511def Test_vim9script_autoload_duplicate()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002512 mkdir('Xdupdir/autoload', 'p')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002513
2514 var lines =<< trim END
2515 vim9script
2516
2517 export def Func()
2518 enddef
2519
2520 def Func()
2521 enddef
2522 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002523 writefile(lines, 'Xdupdir/autoload/dupfunc.vim')
2524 assert_fails('source Xdupdir/autoload/dupfunc.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002525
2526 lines =<< trim END
2527 vim9script
2528
2529 def Func()
2530 enddef
2531
2532 export def Func()
2533 enddef
2534 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002535 writefile(lines, 'Xdupdir/autoload/dup2func.vim')
2536 assert_fails('source Xdupdir/autoload/dup2func.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002537
2538 lines =<< trim END
2539 vim9script
2540
2541 def Func()
2542 enddef
2543
2544 export var Func = 'asdf'
2545 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002546 writefile(lines, 'Xdupdir/autoload/dup3func.vim')
2547 assert_fails('source Xdupdir/autoload/dup3func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002548
2549 lines =<< trim END
2550 vim9script
2551
2552 export var Func = 'asdf'
2553
2554 def Func()
2555 enddef
2556 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002557 writefile(lines, 'Xdupdir/autoload/dup4func.vim')
2558 assert_fails('source Xdupdir/autoload/dup4func.vim', 'E707:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002559
2560 lines =<< trim END
2561 vim9script
2562
2563 var Func = 'asdf'
2564
2565 export def Func()
2566 enddef
2567 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002568 writefile(lines, 'Xdupdir/autoload/dup5func.vim')
2569 assert_fails('source Xdupdir/autoload/dup5func.vim', 'E707:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002570
2571 lines =<< trim END
2572 vim9script
2573
2574 export def Func()
2575 enddef
2576
2577 var Func = 'asdf'
2578 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002579 writefile(lines, 'Xdupdir/autoload/dup6func.vim')
2580 assert_fails('source Xdupdir/autoload/dup6func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002581
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002582 delete('Xdupdir', 'rf')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002583enddef
2584
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002585def Test_autoload_missing_function_name()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002586 mkdir('Xmisdir/autoload', 'p')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002587
2588 var lines =<< trim END
2589 vim9script
2590
2591 def loadme#()
2592 enddef
2593 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002594 writefile(lines, 'Xmisdir/autoload/loadme.vim')
2595 assert_fails('source Xmisdir/autoload/loadme.vim', 'E129:')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002596
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002597 delete('Xmisdir', 'rf')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002598enddef
2599
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002600def Test_autoload_name_wrong()
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002601 var lines =<< trim END
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002602 def Xscriptname#Func()
2603 enddef
2604 END
2605 writefile(lines, 'Xscriptname.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002606 v9.CheckScriptFailure(lines, 'E746:')
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00002607 delete('Xscriptname.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002608
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002609 mkdir('Xwrodir/autoload', 'p')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002610 lines =<< trim END
2611 vim9script
2612 def somescript#Func()
2613 enddef
2614 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002615 writefile(lines, 'Xwrodir/autoload/somescript.vim')
2616 assert_fails('source Xwrodir/autoload/somescript.vim', 'E1263:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002617
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002618 delete('Xwrodir', 'rf')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002619enddef
2620
Bram Moolenaard041f422022-01-12 19:54:00 +00002621def Test_import_autoload_postponed()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002622 mkdir('Xpostdir/autoload', 'p')
Bram Moolenaard041f422022-01-12 19:54:00 +00002623 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002624 exe 'set rtp^=' .. getcwd() .. '/Xpostdir'
Bram Moolenaard041f422022-01-12 19:54:00 +00002625
2626 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002627 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00002628
2629 g:loaded_postponed = 'true'
2630 export var variable = 'bla'
2631 export def Function(): string
2632 return 'bla'
2633 enddef
2634 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002635 writefile(lines, 'Xpostdir/autoload/postponed.vim')
Bram Moolenaard041f422022-01-12 19:54:00 +00002636
2637 lines =<< trim END
2638 vim9script
2639
2640 import autoload 'postponed.vim'
2641 def Tryit()
2642 echo postponed.variable
2643 echo postponed.Function()
2644 enddef
2645 defcompile
2646 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002647 v9.CheckScriptSuccess(lines)
Bram Moolenaard041f422022-01-12 19:54:00 +00002648 assert_false(exists('g:loaded_postponed'))
Bram Moolenaar62aec932022-01-29 21:45:34 +00002649 v9.CheckScriptSuccess(lines + ['Tryit()'])
Bram Moolenaard041f422022-01-12 19:54:00 +00002650 assert_equal('true', g:loaded_postponed)
2651
2652 unlet g:loaded_postponed
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002653 delete('Xpostdir', 'rf')
Bram Moolenaard041f422022-01-12 19:54:00 +00002654 &rtp = save_rtp
2655enddef
2656
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002657def Test_import_autoload_override()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002658 mkdir('Xoverdir/autoload', 'p')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002659 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002660 exe 'set rtp^=' .. getcwd() .. '/Xoverdir'
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002661 test_override('autoload', 1)
2662
2663 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002664 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002665
2666 g:loaded_override = 'true'
2667 export var variable = 'bla'
2668 export def Function(): string
2669 return 'bla'
2670 enddef
2671 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002672 writefile(lines, 'Xoverdir/autoload/override.vim')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002673
2674 lines =<< trim END
2675 vim9script
2676
2677 import autoload 'override.vim'
2678 assert_equal('true', g:loaded_override)
2679
2680 def Tryit()
2681 echo override.doesNotExist
2682 enddef
2683 defcompile
2684 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002685 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002686
2687 test_override('autoload', 0)
2688 unlet g:loaded_override
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002689 delete('Xoverdir', 'rf')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002690 &rtp = save_rtp
2691enddef
2692
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002693def Test_autoload_mapping()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002694 mkdir('Xmapdir/autoload', 'p')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002695 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002696 exe 'set rtp^=' .. getcwd() .. '/Xmapdir'
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002697
2698 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002699 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002700
2701 g:toggle_loaded = 'yes'
2702
2703 export def Toggle(): string
2704 return ":g:toggle_called = 'yes'\<CR>"
2705 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002706 export def Doit()
2707 g:doit_called = 'yes'
2708 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002709 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002710 writefile(lines, 'Xmapdir/autoload/toggle.vim')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002711
2712 lines =<< trim END
2713 vim9script
2714
2715 import autoload 'toggle.vim'
2716
2717 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002718 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2719 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002720 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002721 v9.CheckScriptSuccess(lines)
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002722 assert_false(exists("g:toggle_loaded"))
2723 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002724 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002725
2726 feedkeys("tt", 'xt')
2727 assert_equal('yes', g:toggle_loaded)
2728 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002729 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002730
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002731 feedkeys("xx", 'xt')
2732 assert_equal('yes', g:doit_called)
2733
2734 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2735
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002736 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002737 nunmap xx
2738 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002739 unlet g:toggle_loaded
2740 unlet g:toggle_called
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002741 delete('Xmapdir', 'rf')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002742 &rtp = save_rtp
2743enddef
2744
Bram Moolenaar160aa862022-01-10 21:29:57 +00002745def Test_vim9script_autoload_fails()
2746 var lines =<< trim END
2747 vim9script autoload
2748 var n = 0
2749 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002750 v9.CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002751
2752 lines =<< trim END
2753 vim9script noclear noclear
2754 var n = 0
2755 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002756 v9.CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01002757
2758 lines =<< trim END
2759 vim9script noclears
2760 var n = 0
2761 END
2762 v9.CheckScriptFailure(lines, 'E475: Invalid argument: noclears')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002763enddef
2764
2765def Test_import_autoload_fails()
2766 var lines =<< trim END
2767 vim9script
2768 import autoload autoload 'prefixed.vim'
2769 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002770 v9.CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002771
2772 lines =<< trim END
2773 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002774 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002775 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002776 v9.CheckScriptFailure(lines, 'E282:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002777
2778 lines =<< trim END
2779 vim9script
2780 import autoload '/dir/doesNotExist.vim'
2781 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002782 v9.CheckScriptFailure(lines, 'E282:', 2)
2783
2784 lines =<< trim END
2785 vim9script
2786 import autoload '../testdir'
2787 END
2788 v9.CheckScriptFailure(lines, 'E17:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002789
2790 lines =<< trim END
2791 vim9script
2792 import autoload 'doesNotExist.vim'
2793 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002794 v9.CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002795enddef
2796
2797" test disassembling an auto-loaded function starting with "debug"
2798def Test_vim9_autoload_disass()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002799 mkdir('Xdasdir/autoload', 'p')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002800 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002801 exe 'set rtp^=' .. getcwd() .. '/Xdasdir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002802
2803 var lines =<< trim END
2804 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002805 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002806 return 'debug'
2807 enddef
2808 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002809 writefile(lines, 'Xdasdir/autoload/debugit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002810
2811 lines =<< trim END
2812 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002813 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002814 return 'profile'
2815 enddef
2816 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002817 writefile(lines, 'Xdasdir/autoload/profileit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002818
2819 lines =<< trim END
2820 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002821 assert_equal('debug', debugit#Test())
2822 disass debugit#Test
2823 assert_equal('profile', profileit#Test())
2824 disass profileit#Test
Bram Moolenaar160aa862022-01-10 21:29:57 +00002825 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002826 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002827
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002828 delete('Xdasdir', 'rf')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002829 &rtp = save_rtp
2830enddef
2831
2832" test using a vim9script that is auto-loaded from an autocmd
2833def Test_vim9_aucmd_autoload()
2834 var lines =<< trim END
2835 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002836 export def Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002837 echomsg getreg('"')
2838 enddef
2839 END
2840
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002841 mkdir('Xauldir/autoload', 'p')
2842 writefile(lines, 'Xauldir/autoload/foo.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002843 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002844 exe 'set rtp^=' .. getcwd() .. '/Xauldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002845 augroup test
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002846 autocmd TextYankPost * call foo#Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002847 augroup END
2848
2849 normal Y
2850
2851 augroup test
2852 autocmd!
2853 augroup END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002854 delete('Xauldir', 'rf')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002855 &rtp = save_rtp
2856enddef
2857
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002858" test using a autoloaded file that is case sensitive
2859def Test_vim9_autoload_case_sensitive()
2860 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002861 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002862 export def CaseSensitive(): string
2863 return 'done'
2864 enddef
2865 END
2866
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002867 mkdir('Xcasedir/autoload', 'p')
2868 writefile(lines, 'Xcasedir/autoload/CaseSensitive.vim')
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002869 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002870 exe 'set rtp^=' .. getcwd() .. '/Xcasedir'
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002871
2872 lines =<< trim END
2873 vim9script
2874 import autoload 'CaseSensitive.vim'
2875 assert_equal('done', CaseSensitive.CaseSensitive())
2876 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002877 v9.CheckScriptSuccess(lines)
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002878
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002879 if !has('fname_case')
2880 lines =<< trim END
2881 vim9script
2882 import autoload 'CaseSensitive.vim'
2883 import autoload 'casesensitive.vim'
2884 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002885 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002886 endif
2887
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002888 delete('Xcasedir', 'rf')
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002889 &rtp = save_rtp
2890enddef
2891
Bram Moolenaar160aa862022-01-10 21:29:57 +00002892" This was causing a crash because suppress_errthrow wasn't reset.
2893def Test_vim9_autoload_error()
2894 var lines =<< trim END
2895 vim9script
2896 def crash#func()
2897 try
2898 for x in List()
2899 endfor
2900 catch
2901 endtry
2902 g:ok = true
2903 enddef
2904 fu List()
2905 invalid
2906 endfu
2907 try
2908 alsoinvalid
2909 catch /wontmatch/
2910 endtry
2911 END
2912 call mkdir('Xruntime/autoload', 'p')
2913 call writefile(lines, 'Xruntime/autoload/crash.vim')
2914
2915 # run in a separate Vim to avoid the side effects of assert_fails()
2916 lines =<< trim END
2917 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
2918 call crash#func()
2919 call writefile(['ok'], 'Xdidit')
2920 qall!
2921 END
2922 writefile(lines, 'Xscript')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002923 g:RunVim([], [], '-S Xscript')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002924 assert_equal(['ok'], readfile('Xdidit'))
2925
2926 delete('Xdidit')
2927 delete('Xscript')
2928 delete('Xruntime', 'rf')
2929
2930 lines =<< trim END
2931 vim9script
2932 var foo#bar = 'asdf'
2933 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002934 v9.CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002935enddef
2936
Bram Moolenaar753885b2022-08-24 16:30:36 +01002937def Test_vim9_import_symlink()
2938 if !has('unix')
2939 CheckUnix
2940 else
2941 mkdir('Xto/plugin', 'p')
2942 var lines =<< trim END
2943 vim9script
2944 import autoload 'bar.vim'
2945 g:resultFunc = bar.Func()
2946 g:resultValue = bar.value
2947 END
2948 writefile(lines, 'Xto/plugin/foo.vim')
2949
2950 mkdir('Xto/autoload', 'p')
2951 lines =<< trim END
2952 vim9script
2953 export def Func(): string
2954 return 'func'
2955 enddef
2956 export var value = 'val'
2957 END
2958 writefile(lines, 'Xto/autoload/bar.vim')
2959
2960 var save_rtp = &rtp
2961 &rtp = getcwd() .. '/Xfrom'
2962 system('ln -s ' .. getcwd() .. '/Xto Xfrom')
2963
2964 source Xfrom/plugin/foo.vim
2965 assert_equal('func', g:resultFunc)
2966 assert_equal('val', g:resultValue)
2967
2968 var infoTo = getscriptinfo()->filter((_, v) => v.name =~ 'Xto/autoload/bar')
2969 var infoFrom = getscriptinfo()->filter((_, v) => v.name =~ 'Xfrom/autoload/bar')
2970 assert_equal(1, len(infoTo))
2971 assert_equal(1, len(infoFrom))
2972 assert_equal(infoTo[0].sid, infoFrom[0].sourced)
Bram Moolenaar7ea9fcb2022-08-24 17:46:12 +01002973 var output: string
2974 redir => output
2975 scriptnames
2976 redir END
2977 assert_match(infoFrom[0].sid .. '->' .. infoFrom[0].sourced .. '.*Xfrom', output)
Bram Moolenaar753885b2022-08-24 16:30:36 +01002978
2979 unlet g:resultFunc
2980 unlet g:resultValue
2981 &rtp = save_rtp
2982 delete('Xto', 'rf')
2983 delete('Xfrom', 'rf')
2984 endif
2985enddef
2986
Bram Moolenaard8448622022-01-07 21:39:52 +00002987
2988" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker