blob: aa81851b47ba70669bfa9fe2a6e7ba9a47fde6ba [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()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +010042 writefile(s:export_script_lines, 'Xexport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +000043 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
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +010087 writefile(import_script_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +000088 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
Bram Moolenaard8448622022-01-07 21:39:52 +0000383 # Check that in a Vim9 script 'cpo' is set to the Vim default.
384 # Flags added or removed are also applied to the restored value.
385 set cpo=abcd
386 var lines =<< trim END
387 vim9script
388 g:cpo_in_vim9script = &cpo
389 set cpo+=f
390 set cpo-=c
391 g:cpo_after_vim9script = &cpo
392 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100393 writefile(lines, 'Xvim9_script', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000394 source Xvim9_script
395 assert_equal('fabd', &cpo)
396 set cpo&vim
397 assert_equal(&cpo, g:cpo_in_vim9script)
398 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
399 assert_equal(newcpo, g:cpo_after_vim9script)
400
401 delete('Xvim9_script')
402enddef
403
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100404def Test_import_very_long_name()
405 var lines =<< trim END
406 vim9script
407
408 export var verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname = 'asdf'
409 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100410 writefile(lines, 'Xverylong.vim', 'D')
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100411
412 lines =<< trim END
413 vim9script
414 import './Xverylong.vim'
415
416 g:result = Xverylong.verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname
417 END
418 v9.CheckScriptSuccess(lines)
419 assert_equal('asdf', g:result)
420
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100421 unlet g:result
422enddef
423
Bram Moolenaard8448622022-01-07 21:39:52 +0000424def Test_import_funcref()
425 var lines =<< trim END
426 vim9script
427 export def F(): number
428 return 42
429 enddef
430 export const G = F
431 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100432 writefile(lines, 'Xlib.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000433
434 lines =<< trim END
435 vim9script
436 import './Xlib.vim' as lib
437 const Foo = lib.G()
438 assert_equal(42, Foo)
439
440 def DoTest()
441 const Goo = lib.G()
442 assert_equal(42, Goo)
443 enddef
444 DoTest()
445 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000446 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000447enddef
448
Bram Moolenaar5ab30012022-10-07 17:26:22 +0100449def Test_export_closure()
450 # tests that the closure in block can be compiled, not the import part
451 var lines =<< trim END
452 vim9script
453 {
454 var foo = 42
455 export def Bar(): number
456 return foo
457 enddef
458 }
459 assert_equal(42, Bar())
460 END
461 v9.CheckScriptSuccess(lines)
462enddef
463
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000464def Test_import_duplicate_function()
465 # Function Hover() exists in both scripts, partial should refer to the right
466 # one.
467 var lines =<< trim END
468 vim9script
469
470 def Hover(d: dict<any>): string
471 return 'found it'
472 enddef
473
474 export def NewLspServer(): dict<any>
475 var d: dict<any> = {}
476 d->extend({hover: function('Hover', [d])})
477 return d
478 enddef
479
480 NewLspServer()
481 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100482 writefile(lines, 'Xserver.vim', 'D')
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000483
484 lines =<< trim END
485 vim9script
486
487 import './Xserver.vim' as server
488
489 export def Hover()
490 enddef
491
492 def AddServer()
493 var d: dict<any> = server.NewLspServer()
494 assert_equal('found it', d.hover())
495 enddef
496 AddServer()
497 END
498 v9.CheckScriptSuccess(lines)
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000499enddef
500
501
Bram Moolenaard8448622022-01-07 21:39:52 +0000502def Test_import_fails()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100503 writefile([], 'Xfoo.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000504 var lines =<< trim END
505 import './Xfoo.vim' as foo
506 foo = 'bar'
507 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000508 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
Bram Moolenaard8448622022-01-07 21:39:52 +0000509 lines =<< trim END
510 vim9script
511 import './Xfoo.vim' as foo
512 var 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 var that: any
519 that += foo
520 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000521 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000522 lines =<< trim END
523 vim9script
524 import './Xfoo.vim' as foo
525 foo += 9
526 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000527 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaard8448622022-01-07 21:39:52 +0000528
529 lines =<< trim END
530 vim9script
531 import './Xfoo.vim' as 9foo
532 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000533 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000534 lines =<< trim END
535 vim9script
536 import './Xfoo.vim' as the#foo
537 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000538 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000539 lines =<< trim END
540 vim9script
541 import './Xfoo.vim' as g:foo
542 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000543 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000544
Bram Moolenaard8448622022-01-07 21:39:52 +0000545 lines =<< trim END
546 vim9script
547 def TheFunc()
548 echo 'the func'
549 enddef
550 export var Ref = TheFunc
551 END
552 writefile([], 'Xthat.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000553
Bram Moolenaard8448622022-01-07 21:39:52 +0000554 lines =<< trim END
555 import './Xthat.vim' as That
556 That()
557 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000558 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000559
560 lines =<< trim END
Bram Moolenaar937610b2022-01-19 17:21:29 +0000561 vim9script
562 import './Xthat.vim' as That
563 def Func()
564 echo That()
565 enddef
566 Func()
567 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000568 v9.CheckScriptFailure(lines, 'E1236: Cannot use That itself')
Bram Moolenaar937610b2022-01-19 17:21:29 +0000569
570 lines =<< trim END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000571 import './Xthat.vim' as one
572 import './Xthat.vim' as two
573 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000574 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000575
576 delete('Xthat.vim')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000577
578 lines =<< trim END
579 vim9script
580 export var item = 'hello'
581 import './Xyourself.vim'
582 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100583 writefile(lines, 'Xyourself.vim', 'D')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000584 assert_fails('source Xyourself.vim', 'E1088:')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000585
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100586 mkdir('Ximport', 'R')
Bram Moolenaard8448622022-01-07 21:39:52 +0000587
588 writefile(['vim9script'], 'Ximport/.vim')
589 lines =<< trim END
590 vim9script
591 import './Ximport/.vim'
592 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000593 v9.CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
Bram Moolenaard8448622022-01-07 21:39:52 +0000594 lines =<< trim END
595 vim9script
596 import './Ximport/.vim' as vim
597 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000598 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000599
600 writefile(['vim9script'], 'Ximport/.vimrc')
601 lines =<< trim END
602 vim9script
603 import './Ximport/.vimrc'
604 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000605 v9.CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000606 lines =<< trim END
607 vim9script
608 import './Ximport/.vimrc' as vimrc
609 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000610 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000611
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100612 new
613 setline(1, ['vim9script', 'import "" as abc'])
614 assert_fails('source', 'E1071: Invalid string for :import: "" as abc')
615 setline(2, 'import [] as abc')
616 assert_fails('source', 'E1071: Invalid string for :import: [] as abc')
617 setline(2, 'import test_null_string() as abc')
618 assert_fails('source', 'E1071: Invalid string for :import: test_null_string() as abc')
619 bw!
620 call writefile(['vim9script', "import './Xfoo.vim' ask expo"], 'Xbar.vim')
621 assert_fails('source Xbar.vim', 'E488: Trailing characters: ask expo')
622 writefile([], 'Xtemp')
623 call writefile(['vim9script', "import './Xtemp'"], 'Xbar.vim')
624 assert_fails('source Xbar.vim', 'E1257: Imported script must use "as" or end in .vim: Xtemp')
625 delete('Xtemp')
626 call writefile(['vim9script', "import './Xfoo.vim' as abc | foobar"], 'Xbar.vim')
627 assert_fails('source Xbar.vim', 'E492: Not an editor command: foobar')
628 call delete('Xbar.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000629enddef
630
631func g:Trigger()
632 source Ximport.vim
633 return "echo 'yes'\<CR>"
634endfunc
635
636def Test_import_export_expr_map()
637 # check that :import and :export work when buffer is locked
638 var export_lines =<< trim END
639 vim9script
640 export def That(): string
641 return 'yes'
642 enddef
643 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100644 writefile(export_lines, 'Xexport_that.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000645
646 var import_lines =<< trim END
647 vim9script
648 import './Xexport_that.vim' as that
649 assert_equal('yes', that.That())
650 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100651 writefile(import_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000652
653 nnoremap <expr> trigger g:Trigger()
654 feedkeys('trigger', "xt")
655
Bram Moolenaard8448622022-01-07 21:39:52 +0000656 nunmap trigger
657enddef
658
659def Test_import_in_filetype()
660 # check that :import works when the buffer is locked
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100661 mkdir('ftplugin', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +0000662 var export_lines =<< trim END
663 vim9script
664 export var That = 'yes'
665 END
666 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
667
668 var import_lines =<< trim END
669 vim9script
670 import './Xexport_ft.vim' as ft
671 assert_equal('yes', ft.That)
672 g:did_load_mytpe = 1
673 END
674 writefile(import_lines, 'ftplugin/qf.vim')
675
676 var save_rtp = &rtp
677 &rtp = getcwd() .. ',' .. &rtp
678
679 filetype plugin on
680 copen
681 assert_equal(1, g:did_load_mytpe)
682
683 quit!
Bram Moolenaard8448622022-01-07 21:39:52 +0000684 &rtp = save_rtp
685enddef
686
687def Test_use_import_in_mapping()
688 var lines =<< trim END
689 vim9script
Bram Moolenaar89445512022-04-14 12:58:23 +0100690 export def Funcx(nr: number)
691 g:result = nr
Bram Moolenaard8448622022-01-07 21:39:52 +0000692 enddef
693 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100694 writefile(lines, 'XsomeExport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000695 lines =<< trim END
696 vim9script
697 import './XsomeExport.vim' as some
698 var Funcy = some.Funcx
Bram Moolenaar89445512022-04-14 12:58:23 +0100699 nnoremap <F3> :call <sid>Funcy(42)<cr>
700 nnoremap <F4> :call <sid>some.Funcx(44)<cr>
Bram Moolenaard8448622022-01-07 21:39:52 +0000701 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100702 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +0000703
704 source Xmapscript.vim
705 feedkeys("\<F3>", "xt")
706 assert_equal(42, g:result)
Bram Moolenaar89445512022-04-14 12:58:23 +0100707 feedkeys("\<F4>", "xt")
708 assert_equal(44, g:result)
Bram Moolenaard8448622022-01-07 21:39:52 +0000709
710 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +0000711 nunmap <F3>
Bram Moolenaar89445512022-04-14 12:58:23 +0100712 nunmap <F4>
713enddef
714
Bram Moolenaar648dd882022-04-14 21:36:15 +0100715def Test_use_relative_autoload_import_in_mapping()
Bram Moolenaar89445512022-04-14 12:58:23 +0100716 var lines =<< trim END
717 vim9script
718 export def Func()
719 g:result = 42
720 enddef
721 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100722 writefile(lines, 'XrelautoloadExport.vim', 'D')
Bram Moolenaar89445512022-04-14 12:58:23 +0100723 lines =<< trim END
724 vim9script
Bram Moolenaar648dd882022-04-14 21:36:15 +0100725 import autoload './XrelautoloadExport.vim' as some
Bram Moolenaar89445512022-04-14 12:58:23 +0100726 nnoremap <F3> :call <SID>some.Func()<CR>
727 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100728 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaar89445512022-04-14 12:58:23 +0100729
730 source Xmapscript.vim
Bram Moolenaar648dd882022-04-14 21:36:15 +0100731 assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100732 var l = getscriptinfo()
733 assert_match('XrelautoloadExport.vim$', l[-1].name)
734 assert_true(l[-1].autoload)
Bram Moolenaar89445512022-04-14 12:58:23 +0100735 feedkeys("\<F3>", "xt")
736 assert_equal(42, g:result)
Yegappan Lakshmanan520f6ef2022-08-25 17:40:40 +0100737 l = getscriptinfo({name: 'XrelautoloadExport'})
738 assert_true(len(l) == 1)
739 assert_match('XrelautoloadExport.vim$', l[0].name)
740 assert_false(l[0].autoload)
Yegappan Lakshmanan2f892d82022-08-28 18:52:10 +0100741 assert_equal(999999, l[0].version)
Bram Moolenaar89445512022-04-14 12:58:23 +0100742
743 unlet g:result
Bram Moolenaar89445512022-04-14 12:58:23 +0100744 nunmap <F3>
Bram Moolenaard8448622022-01-07 21:39:52 +0000745enddef
746
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100747def Test_autoload_import_var()
748 # variable name starts with "autoload"
749 var lines =<< trim END
750 vim9script
751 var autoloaded = "Xtest.vim"
752 import autoloaded
753 END
754 v9.CheckScriptFailure(lines, 'E1053: Could not import "Xtest.vim')
755enddef
756
Bram Moolenaar648dd882022-04-14 21:36:15 +0100757def Test_use_autoload_import_in_mapping()
758 var lines =<< trim END
759 vim9script
760 export def Func()
761 g:result = 49
762 enddef
763 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100764 mkdir('Ximpdir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100765 writefile(lines, 'Ximpdir/autoload/XautoloadExport.vim')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100766 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100767 exe 'set rtp^=' .. getcwd() .. '/Ximpdir'
Bram Moolenaar648dd882022-04-14 21:36:15 +0100768
769 lines =<< trim END
770 vim9script
771 import autoload 'XautoloadExport.vim' as some
772 nnoremap <F3> :call <SID>some.Func()<CR>
773 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100774 writefile(lines, 'Xmapscript.vim', 'D')
Bram Moolenaar648dd882022-04-14 21:36:15 +0100775
776 source Xmapscript.vim
777 assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
778 feedkeys("\<F3>", "xt")
779 assert_equal(49, g:result)
780
781 unlet g:result
Bram Moolenaar648dd882022-04-14 21:36:15 +0100782 nunmap <F3>
Bram Moolenaar648dd882022-04-14 21:36:15 +0100783 &rtp = save_rtp
784enddef
785
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000786def Test_use_import_in_command_completion()
Bram Moolenaar15d16352022-01-17 20:09:08 +0000787 var lines =<< trim END
788 vim9script
789 export def Complete(..._): list<string>
790 return ['abcd']
791 enddef
792 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100793 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar15d16352022-01-17 20:09:08 +0000794
795 lines =<< trim END
796 vim9script
797 import './Xscript.vim'
798
799 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
800 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
801 assert_equal('#Cmd abcd', @:)
802 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000803 v9.CheckScriptSuccess(lines)
Bram Moolenaar15d16352022-01-17 20:09:08 +0000804
805 delcommand Cmd
Bram Moolenaar15d16352022-01-17 20:09:08 +0000806enddef
807
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100808def Test_use_import_with_funcref_in_command_completion()
809 var lines =<< trim END
810 vim9script
811 export def Complete(..._): list<string>
812 return ['abcd']
813 enddef
814 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100815 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100816
817 lines =<< trim END
818 vim9script
819 import './Xscript.vim'
820
821 var Ref = Xscript.Complete
822 exe "command -nargs=1 -complete=customlist," .. expand('<SID>') .. "Ref Cmd echo 'ok'"
823 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
824 assert_equal('#Cmd abcd', @:)
825 END
826 v9.CheckScriptSuccess(lines)
827
828 delcommand Cmd
Bram Moolenaar12eb2eb2022-04-15 22:57:09 +0100829enddef
830
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000831def Test_use_autoload_import_in_insert_completion()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100832 mkdir('Xinsdir/autoload', 'pR')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000833 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100834 exe 'set rtp^=' .. getcwd() .. '/Xinsdir'
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000835
836 var lines =<< trim END
837 vim9script
838 export def ThesaurusFunc(findbase: bool, _): any
839 if findbase
840 return 1
841 endif
842 return [
843 'check',
844 'experiment',
845 'test',
846 'verification'
847 ]
848 enddef
849 g:completion_loaded = 'yes'
850 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100851 writefile(lines, 'Xinsdir/autoload/completion.vim')
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000852
853 new
854 lines =<< trim END
855 vim9script
856 g:completion_loaded = 'no'
857 import autoload 'completion.vim'
858 set thesaurusfunc=completion.ThesaurusFunc
859 assert_equal('no', g:completion_loaded)
860 feedkeys("i\<C-X>\<C-T>\<C-N>\<Esc>", 'xt')
861 assert_equal('experiment', getline(1))
862 assert_equal('yes', g:completion_loaded)
863 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000864 v9.CheckScriptSuccess(lines)
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000865
866 set thesaurusfunc=
867 bwipe!
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000868 &rtp = save_rtp
869enddef
870
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000871def Test_use_autoload_import_partial_in_opfunc()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100872 mkdir('Xpartdir/autoload', 'pR')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000873 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100874 exe 'set rtp^=' .. getcwd() .. '/Xpartdir'
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000875
876 var lines =<< trim END
877 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100878 export def Opfunc1(..._)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000879 g:opfunc_called = 'yes'
880 enddef
881 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100882 writefile(lines, 'Xpartdir/autoload/opfunc.vim')
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000883
884 new
885 lines =<< trim END
886 vim9script
887 import autoload 'opfunc.vim'
888 nnoremap <expr> <F3> TheFunc()
889 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100890 &operatorfunc = function('opfunc.Opfunc1', [0])
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000891 return 'g@'
892 enddef
893 feedkeys("\<F3>l", 'xt')
894 assert_equal('yes', g:opfunc_called)
895 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000896 v9.CheckScriptSuccess(lines)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000897
898 set opfunc=
899 bwipe!
Bram Moolenaar06b77222022-01-25 15:51:56 +0000900 nunmap <F3>
901 &rtp = save_rtp
902enddef
903
904def Test_set_opfunc_to_autoload_func_directly()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100905 mkdir('Xdirdir/autoload', 'pR')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000906 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100907 exe 'set rtp^=' .. getcwd() .. '/Xdirdir'
Bram Moolenaar06b77222022-01-25 15:51:56 +0000908
909 var lines =<< trim END
910 vim9script
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100911 export def Opfunc2(..._)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000912 g:opfunc_called = 'yes'
913 enddef
914 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100915 writefile(lines, 'Xdirdir/autoload/opfunc.vim')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000916
917 new
918 lines =<< trim END
919 vim9script
920 import autoload 'opfunc.vim'
921 nnoremap <expr> <F3> TheFunc()
922 def TheFunc(): string
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100923 &operatorfunc = opfunc.Opfunc2
Bram Moolenaar06b77222022-01-25 15:51:56 +0000924 return 'g@'
925 enddef
926 feedkeys("\<F3>l", 'xt')
927 assert_equal('yes', g:opfunc_called)
928 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000929 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000930
931 set opfunc=
932 bwipe!
Bram Moolenaar06b77222022-01-25 15:51:56 +0000933 nunmap <F3>
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000934 &rtp = save_rtp
935enddef
936
Bram Moolenaare70dd112022-01-21 16:31:11 +0000937def Test_use_autoload_import_in_fold_expression()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100938 mkdir('Xfolddir/autoload', 'pR')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000939 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100940 exe 'set rtp^=' .. getcwd() .. '/Xfolddir'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000941
942 var lines =<< trim END
943 vim9script
944 export def Expr(): string
945 return getline(v:lnum) =~ '^#' ? '>1' : '1'
946 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000947 export def Text(): string
948 return 'fold text'
949 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000950 g:fold_loaded = 'yes'
951 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100952 writefile(lines, 'Xfolddir/autoload/fold.vim')
Bram Moolenaare70dd112022-01-21 16:31:11 +0000953
954 lines =<< trim END
955 vim9script
956 import autoload 'fold.vim'
957 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000958 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000959 &foldmethod = 'expr'
960 &debug = 'throw'
961 END
962 new
963 setline(1, ['# one', 'text', '# two', 'text'])
964 g:fold_loaded = 'no'
Bram Moolenaar62aec932022-01-29 21:45:34 +0000965 v9.CheckScriptSuccess(lines)
Bram Moolenaare70dd112022-01-21 16:31:11 +0000966 assert_equal('no', g:fold_loaded)
967 redraw
968 assert_equal('yes', g:fold_loaded)
969
970 # Check that script context of 'foldexpr' is copied to another buffer.
971 edit! otherfile
972 redraw
973
Bram Moolenaar9530b582022-01-22 13:39:08 +0000974 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +0000975 bwipe!
Bram Moolenaare70dd112022-01-21 16:31:11 +0000976 &rtp = save_rtp
977enddef
978
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100979def Test_autoload_import_relative()
980 var lines =<< trim END
981 vim9script
982
983 g:loaded = 'yes'
984 export def RelFunc(): string
985 return 'relfunc'
986 enddef
987 def NotExported()
988 echo 'not'
989 enddef
990
991 export var someText = 'some text'
992 var notexp = 'bad'
993 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100994 writefile(lines, 'XimportRel.vim', 'D')
995 writefile(lines, 'XimportRel2.vim', 'D')
996 writefile(lines, 'XimportRel3.vim', 'D')
997 writefile(lines, 'XimportRel4.vim', 'D')
998 writefile(lines, 'XimportRel5.vim', 'D')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100999
1000 lines =<< trim END
1001 vim9script
1002 g:loaded = 'no'
1003 import autoload './XimportRel.vim'
1004 assert_equal('no', g:loaded)
1005
1006 def AFunc(): string
1007 var res = ''
1008 res ..= XimportRel.RelFunc()
1009 res ..= '/'
1010 res ..= XimportRel.someText
1011 XimportRel.someText = 'from AFunc'
1012 return res
1013 enddef
1014 # script not loaded when compiling
1015 defcompile
1016 assert_equal('no', g:loaded)
1017
1018 assert_equal('relfunc/some text', AFunc())
1019 assert_equal('yes', g:loaded)
1020 unlet g:loaded
1021
1022 assert_equal('from AFunc', XimportRel.someText)
1023 XimportRel.someText = 'from script'
1024 assert_equal('from script', XimportRel.someText)
1025 END
1026 v9.CheckScriptSuccess(lines)
1027
1028 lines =<< trim END
1029 vim9script
1030 import autoload './XimportRel.vim'
1031 echo XimportRel.NotExported()
1032 END
1033 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 3)
1034
1035 lines =<< trim END
1036 vim9script
1037 import autoload './XimportRel.vim'
1038 echo XimportRel.notexp
1039 END
1040 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1041
1042 lines =<< trim END
1043 vim9script
1044 import autoload './XimportRel.vim'
1045 XimportRel.notexp = 'bad'
1046 END
1047 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1048
1049 lines =<< trim END
1050 vim9script
1051 import autoload './XimportRel.vim'
1052 def Func()
1053 echo XimportRel.NotExported()
1054 enddef
1055 Func()
1056 END
1057 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 1)
1058
1059 lines =<< trim END
1060 vim9script
1061 import autoload './XimportRel.vim'
1062 def Func()
1063 echo XimportRel.notexp
1064 enddef
1065 Func()
1066 END
1067 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1068
Bram Moolenaar10611952022-04-03 21:11:34 +01001069 # Same, script not imported before
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001070 lines =<< trim END
1071 vim9script
Bram Moolenaar10611952022-04-03 21:11:34 +01001072 import autoload './XimportRel4.vim'
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001073 def Func()
Bram Moolenaar10611952022-04-03 21:11:34 +01001074 echo XimportRel4.notexp
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001075 enddef
1076 Func()
1077 END
1078 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1079
Bram Moolenaar10611952022-04-03 21:11:34 +01001080 # does not fail if the script wasn't loaded yet and only compiling
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001081 g:loaded = 'no'
1082 lines =<< trim END
1083 vim9script
1084 import autoload './XimportRel2.vim'
1085 def Func()
1086 echo XimportRel2.notexp
1087 enddef
1088 defcompile
1089 END
1090 v9.CheckScriptSuccess(lines)
1091 assert_equal('no', g:loaded)
1092
Bram Moolenaar10611952022-04-03 21:11:34 +01001093 lines =<< trim END
1094 vim9script
1095 import autoload './XimportRel.vim'
1096 def Func()
1097 XimportRel.notexp = 'bad'
1098 enddef
1099 Func()
1100 END
1101 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1102
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001103 # fails with a not loaded import
1104 lines =<< trim END
1105 vim9script
1106 import autoload './XimportRel3.vim'
1107 def Func()
1108 XimportRel3.notexp = 'bad'
1109 enddef
1110 Func()
1111 END
1112 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1113 assert_equal('yes', g:loaded)
1114 unlet g:loaded
1115
Bram Moolenaar10611952022-04-03 21:11:34 +01001116 lines =<< trim END
1117 vim9script
1118 import autoload './XimportRel5.vim'
1119 def Func()
1120 XimportRel5.nosuchvar = 'bad'
1121 enddef
1122 Func()
1123 END
1124 v9.CheckScriptFailure(lines, 'E121: Undefined variable: nosuchvar', 1)
1125 unlet g:loaded
1126
1127 # nasty: delete script after compiling function
1128 writefile(['vim9script'], 'XimportRelDel.vim')
1129 lines =<< trim END
1130 vim9script
1131
1132 import autoload './XimportRelDel.vim'
1133 def DoIt()
1134 echo XimportRelDel.var
1135 enddef
1136 defcompile
1137 delete('XimportRelDel.vim')
1138 DoIt()
1139 END
Bram Moolenaar242c1522022-04-03 21:52:51 +01001140 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001141enddef
1142
Yegappan Lakshmananf135fa22024-04-20 18:31:21 +02001143" autoload relative, access from compiled function.
1144" Github issues: #14565, #14579
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001145def Test_autoload_import_relative_compiled_buffer()
Ernie Rael1433ac92024-04-17 22:36:32 +02001146 var lines =<< trim END
1147 vim9script
1148
1149 export def F1(): string
1150 return 'InFile.vim'
1151 enddef
1152 END
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001153 writefile(lines, 'Ximportrelativebuffer.vim', 'D')
Ernie Rael1433ac92024-04-17 22:36:32 +02001154 lines =<< trim END
1155 vim9script
1156
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001157 import autoload './Ximportrelativebuffer.vim' as xfile
Ernie Rael1433ac92024-04-17 22:36:32 +02001158
1159 def F(): string
1160 return xfile.F1()
1161 enddef
1162 assert_equal('InFile.vim', F())
1163 END
1164 new
1165 setline(1, lines)
1166 :source
Yegappan Lakshmananf135fa22024-04-20 18:31:21 +02001167 # source one more time to detect issues with clearing the script state and
1168 # variables
1169 :source
1170 :bw!
1171enddef
1172
1173" Test for relative import when sourcing a buffer in another directory
1174def Test_autoload_import_relative_from_buffer_in_dir()
1175 mkdir('Ximportrelative/dir1/dir2', 'pR')
1176 var lines =<< trim END
1177 vim9script
1178
1179 export def F1(): string
1180 return 'InFile.vim'
1181 enddef
1182 END
1183 writefile(lines, 'Ximportrelative/dir1/dir2/Ximport.vim')
1184 lines =<< trim END
1185 vim9script
1186
1187 import autoload './Ximport.vim' as xfile
1188
1189 def F(): string
1190 return xfile.F1()
1191 enddef
1192 assert_equal('InFile.vim', F())
1193 END
1194 writefile(lines, 'Ximportrelative/dir1/dir2/Xrelative.vim')
1195
1196 split Ximportrelative/dir1/dir2/Xrelative.vim
1197 :source
1198 # source one more time to detect issues with clearing the script state and
1199 # variables
1200 :source
Ernie Rael6f1d05b2024-04-18 22:53:33 +02001201 :bw!
Ernie Rael1433ac92024-04-17 22:36:32 +02001202enddef
1203
Ernie Rael84f6dc72024-04-21 14:45:48 +02001204" Test modifying exported autoload variable. Github issue: #14591
1205def Test_autoload_export_variables()
1206 mkdir('Xautoload_vars/autoload', 'pR')
1207 var lines =<< trim END
1208 vim9script
Ernie Rael3f821d62024-04-24 20:07:50 +02001209 g:Xautoload_vars_autoload = true
Ernie Rael84f6dc72024-04-21 14:45:48 +02001210 export var val = 11
1211 val = 42
1212 END
1213
1214 # Test that the imported script, above, can modify the exported variable;
1215 # and test that the importing script, below, can modify the variable.
1216 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f2.vim', 'D')
1217 lines =<< trim END
1218 vim9script
Ernie Rael3f821d62024-04-24 20:07:50 +02001219 g:Xautoload_vars_autoload = false
Ernie Rael84f6dc72024-04-21 14:45:48 +02001220
1221 import autoload './Xautoload_vars/autoload/Xauto_vars_f2.vim' as f2
Ernie Rael3f821d62024-04-24 20:07:50 +02001222 # Verify that the import statement does not load the file.
1223 assert_equal(false, g:Xautoload_vars_autoload)
Ernie Rael84f6dc72024-04-21 14:45:48 +02001224
1225 def F(): number
1226 return f2.val
1227 enddef
Ernie Rael3f821d62024-04-24 20:07:50 +02001228 # Verify compile does not load the file.
1229 defcompile F
1230 assert_equal(false, g:Xautoload_vars_autoload)
1231
1232 # load the file by accessing the exported variable
Ernie Rael84f6dc72024-04-21 14:45:48 +02001233 assert_equal(42, F())
Ernie Rael3f821d62024-04-24 20:07:50 +02001234 assert_equal(true, g:Xautoload_vars_autoload)
1235 unlet g:Xautoload_vars_autoload
1236
Ernie Rael84f6dc72024-04-21 14:45:48 +02001237 assert_equal(42, f2.val)
1238 f2.val = 17
1239 assert_equal(17, f2.val)
1240
1241 def G()
1242 f2.val = 19
1243 enddef
1244 G()
1245 assert_equal(19, f2.val)
1246 END
1247 v9.CheckScriptSuccess(lines)
1248
1249 # Test const var is not modifiable.
1250 lines =<< trim END
1251 vim9script
1252 export const val = 11
1253 val = 42
1254 END
1255 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f3.vim', 'D')
1256 lines =<< trim END
1257 vim9script
1258
1259 import autoload './Xautoload_vars/autoload/Xauto_vars_f3.vim' as f3
1260
1261 var x = f3.val
1262 END
1263 v9.CheckScriptFailure(lines, 'E46:')
1264
1265 # Test const var is not modifiable from importing script.
1266 lines =<< trim END
1267 vim9script
1268 export const val = 11
1269 END
1270 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f4.vim', 'D')
1271 lines =<< trim END
1272 vim9script
1273
1274 import autoload './Xautoload_vars/autoload/Xauto_vars_f4.vim' as f4
1275
1276 f4.val = 13
1277 END
1278 v9.CheckScriptFailure(lines, 'E46:')
Ernie Rael3f821d62024-04-24 20:07:50 +02001279
1280 # Test const var is not modifiable from importing script from :def.
1281 # Github issue: #14606
1282 lines =<< trim END
1283 vim9script
1284 export const val = 11
1285 END
1286 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f5.vim', 'D')
1287 lines =<< trim END
1288 vim9script
1289
1290 import autoload './Xautoload_vars/autoload/Xauto_vars_f5.vim' as f5
1291
1292 def F()
1293 f5.val = 13
1294 enddef
1295 F()
1296 END
1297 v9.CheckScriptFailure(lines, 'E741:')
1298
1299 # Still part of Github issue: #14606
1300 lines =<< trim END
1301 vim9script
1302 export var val = 11
1303 END
1304 writefile(lines, 'Xautoload_vars/autoload/Xauto_vars_f6.vim', 'D')
1305 lines =<< trim END
1306 vim9script
1307
1308 import autoload './Xautoload_vars/autoload/Xauto_vars_f6.vim' as f6
1309
1310 def F()
1311 f6.val = 13
1312 enddef
1313 F()
1314 assert_equal(13, f6.val)
1315 END
1316 v9.CheckScriptSuccess(lines)
Ernie Rael84f6dc72024-04-21 14:45:48 +02001317enddef
1318
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001319def Test_autoload_import_relative_autoload_dir()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001320 mkdir('autoload', 'pR')
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001321 var lines =<< trim END
1322 vim9script
1323 export def Bar()
1324 g:called_bar = 'yes'
1325 enddef
1326 END
1327 writefile(lines, 'autoload/script.vim')
1328
1329 lines =<< trim END
1330 vim9script
1331 import autoload './autoload/script.vim'
1332 def Foo()
1333 script.Bar()
1334 enddef
1335 Foo()
1336 assert_equal('yes', g:called_bar)
1337 END
1338 v9.CheckScriptSuccess(lines)
1339
1340 unlet g:called_bar
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001341enddef
1342
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001343def Test_autoload_import_deleted()
1344 var lines =<< trim END
1345 vim9script
1346 export const FOO = 1
1347 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001348 writefile(lines, 'Xa.vim', 'D')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001349
1350 lines =<< trim END
1351 vim9script
1352 import autoload './Xa.vim'
1353
1354 delete('Xa.vim')
1355 var x = Xa.FOO
1356 END
1357 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001358enddef
1359
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01001360def Test_autoload_import_using_const()
1361 mkdir('Xdir/autoload', 'pR')
1362 var lines =<< trim END
1363 vim9script
1364 export const FOO = 42
1365 echomsg FOO
1366 END
1367 writefile(lines, 'Xdir/autoload/exp.vim')
1368
1369 var save_rtp = &rtp
1370 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1371 lines =<< trim END
1372 vim9script
1373 import autoload 'exp.vim'
1374 assert_equal(42, exp.FOO)
1375 END
1376 v9.CheckScriptSuccess(lines)
1377 &rtp = save_rtp
1378enddef
1379
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001380func Test_import_in_diffexpr()
1381 CheckExecutable diff
1382
1383 call Run_Test_import_in_diffexpr()
1384endfunc
1385
1386def Run_Test_import_in_diffexpr()
1387 var lines =<< trim END
1388 vim9script
1389
1390 export def DiffExpr()
1391 # Prepend some text to check diff type detection
1392 writefile(['warning', ' message'], v:fname_out)
1393 silent exe '!diff ' .. v:fname_in .. ' '
1394 .. v:fname_new .. '>>' .. v:fname_out
1395 enddef
1396 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001397 writefile(lines, 'Xdiffexpr', 'D')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001398
1399 lines =<< trim END
1400 vim9script
1401 import './Xdiffexpr' as diff
1402
1403 set diffexpr=diff.DiffExpr()
1404 set diffopt=foldcolumn:0
1405 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001406 v9.CheckScriptSuccess(lines)
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001407
1408 enew!
1409 call setline(1, ['one', 'two', 'three'])
1410 diffthis
1411
1412 botright vert new
1413 call setline(1, ['one', 'two', 'three.'])
1414 diffthis
1415 # we only check if this does not cause errors
1416 redraw
1417
1418 diffoff!
Bram Moolenaar50761872022-06-26 18:01:00 +01001419 set diffexpr=
1420 set diffopt&
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001421 bwipe!
1422 bwipe!
1423enddef
1424
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001425def Test_import_in_patchexpr()
1426 var lines =<< trim END
1427 vim9script
1428 export def TPatch()
1429 call writefile(['output file'], v:fname_out)
1430 enddef
1431 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001432 writefile(lines, 'Xpatchexpr', 'D')
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001433
1434 lines =<< trim END
1435 vim9script
1436 import './Xpatchexpr' as patch
1437 set patchexpr=patch.TPatch()
1438 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001439 v9.CheckScriptSuccess(lines)
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001440
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001441 call writefile(['input file'], 'Xinput', 'D')
1442 call writefile(['diff file'], 'Xdiff', 'D')
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001443 :%bwipe!
1444 edit Xinput
1445 diffpatch Xdiff
1446 call assert_equal('output file', getline(1))
1447
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001448 set patchexpr&
1449 :%bwipe!
1450enddef
1451
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001452def Test_import_in_formatexpr()
1453 var lines =<< trim END
1454 vim9script
1455 export def MyFormatExpr(): number
1456 g:did_format = 'yes'
1457 return 0
1458 enddef
1459 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001460 writefile(lines, 'Xformatter', 'D')
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001461
1462 lines =<< trim END
1463 vim9script
1464 import './Xformatter' as format
1465 set formatexpr=format.MyFormatExpr()
1466 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001467 v9.CheckScriptSuccess(lines)
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001468
1469 new
1470 setline(1, ['a', 'b', 'c'])
1471 normal gqG
1472 assert_equal('yes', g:did_format)
1473
1474 bwipe!
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001475 unlet g:did_format
1476 set formatexpr=
1477enddef
1478
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001479def Test_import_in_includeexpr()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001480 writefile(['found it'], 'Xthisfile', 'D')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001481 new
1482
1483 var lines =<< trim END
1484 vim9script
1485 export def DoSub(): string
1486 return substitute(v:fname, 'that', 'this', '')
1487 enddef
1488 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001489 writefile(lines, 'Xinclude.vim', 'D')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001490
1491 lines =<< trim END
1492 vim9script
1493 import './Xinclude.vim'
1494 set includeexpr=Xinclude.DoSub()
1495 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001496 v9.CheckScriptSuccess(lines)
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001497
1498 setline(1, ['Xthatfile'])
1499 exe "normal \<C-W>f"
1500 assert_equal('Xthisfile', expand('%'))
1501
1502 bwipe!
1503 bwipe!
1504 set includeexpr=
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001505enddef
1506
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001507def Test_import_in_indentexpr()
1508 var lines =<< trim END
1509 vim9script
1510 export def GetIndent(): number
1511 return 5
1512 enddef
1513 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001514 writefile(lines, 'Xindenter', 'D')
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001515
1516 lines =<< trim END
1517 vim9script
1518 import './Xindenter' as indent
1519 set indentexpr=indent.GetIndent()
1520 set debug=throw
1521 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001522 v9.CheckScriptSuccess(lines)
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001523
1524 new
1525 setline(1, 'hello')
1526 normal ==
1527 assert_equal(' hello', getline(1))
1528
1529 bwipe!
1530 set indentexpr= debug=
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001531enddef
1532
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001533func Test_import_in_printexpr()
1534 CheckFeature postscript
1535 call Run_Test_import_in_printexpr()
1536endfunc
1537
1538def Run_Test_import_in_printexpr()
1539 var lines =<< trim END
1540 vim9script
1541 export def PrintFile(): bool
1542 g:printed = 'yes'
1543 delete('v:fname_in')
1544 return false
1545 enddef
1546 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001547 writefile(lines, 'Xprint.vim', 'D')
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001548
1549 lines =<< trim END
1550 vim9script
1551 import './Xprint.vim'
1552 set printexpr=Xprint.PrintFile()
1553 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001554 v9.CheckScriptSuccess(lines)
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001555
1556 help
1557 hardcopy dummy args
1558 assert_equal('yes', g:printed)
1559
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001560 set printexpr=
1561enddef
1562
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001563" Test for using an imported function as 'findfunc'
1564func Test_import_in_findfunc()
1565 call Run_Test_import_in_findfunc()
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001566endfunc
1567
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001568def Run_Test_import_in_findfunc()
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001569 var lines =<< trim END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001570 vim9script
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001571
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001572 export def FindFunc(pat: string, cmdexpand: bool): list<string>
1573 var fnames = ['Xfile1.c', 'Xfile2.c', 'Xfile3.c']
1574 return fnames->filter((_, v) => v =~? pat)
1575 enddef
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001576 END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001577 writefile(lines, 'Xfindfunc', 'D')
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001578
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001579 # Test using the "set" command
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001580 lines =<< trim END
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001581 vim9script
1582 import './Xfindfunc' as find1
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001583
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001584 set findfunc=find1.FindFunc
1585 END
1586 v9.CheckScriptSuccess(lines)
1587
1588 enew!
1589 find Xfile2
1590 assert_equal('Xfile2.c', @%)
1591 bwipe!
1592
1593 botright vert new
1594 find Xfile1
1595 assert_equal('Xfile1.c', @%)
1596 bw!
1597
1598 # Test using the option variable
1599 lines =<< trim END
1600 vim9script
1601 import './Xfindfunc' as find2
1602
1603 &findfunc = find2.FindFunc
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001604 END
1605 v9.CheckScriptSuccess(lines)
1606
1607 enew!
1608 find Xfile2
1609 assert_equal('Xfile2.c', @%)
1610 bwipe!
1611
1612 botright vert new
1613 find Xfile1
1614 assert_equal('Xfile1.c', @%)
1615
Yegappan Lakshmanana13f3a42024-11-02 18:40:10 +01001616 set findfunc=
Yegappan Lakshmananbdac2ef2024-10-28 21:01:28 +01001617 bwipe!
1618enddef
1619
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001620def Test_import_in_charconvert()
1621 var lines =<< trim END
1622 vim9script
1623 export def MakeUpper(): bool
1624 var data = readfile(v:fname_in)
1625 map(data, 'toupper(v:val)')
1626 writefile(data, v:fname_out)
1627 return false # success
1628 enddef
1629 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001630 writefile(lines, 'Xconvert.vim', 'D')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001631
1632 lines =<< trim END
1633 vim9script
1634 import './Xconvert.vim' as conv
1635 set charconvert=conv.MakeUpper()
1636 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001637 v9.CheckScriptSuccess(lines)
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001638
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001639 writefile(['one', 'two'], 'Xiicfile', 'D')
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001640 new Xiicfile
1641 write ++enc=ucase Xiicfile1
1642 assert_equal(['ONE', 'TWO'], readfile('Xiicfile1'))
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001643
Bram Moolenaarb18b4962022-09-02 21:55:50 +01001644 delete('Xiicfile1')
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001645 bwipe!
1646 set charconvert&
1647enddef
1648
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001649func Test_import_in_spellsuggest_expr()
1650 CheckFeature spell
1651 call Run_Test_import_in_spellsuggest_expr()
1652endfunc
1653
1654def Run_Test_import_in_spellsuggest_expr()
1655 var lines =<< trim END
1656 vim9script
1657 export def MySuggest(): list<any>
1658 return [['Fox', 8], ['Fop', 9]]
1659 enddef
1660 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001661 writefile(lines, 'Xsuggest.vim', 'D')
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001662
1663 lines =<< trim END
1664 vim9script
1665 import './Xsuggest.vim' as sugg
1666 set spell spellsuggest=expr:sugg.MySuggest()
1667 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001668 v9.CheckScriptSuccess(lines)
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001669
1670 set verbose=1 # report errors
1671 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
1672
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001673 set nospell spellsuggest& verbose=0
1674enddef
1675
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001676def Test_import_in_lambda_method()
1677 var lines =<< trim END
1678 vim9script
1679 export def Retarg(e: any): any
1680 return e
1681 enddef
1682 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001683 writefile(lines, 'XexportRetarg.vim', 'D')
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001684 lines =<< trim END
1685 vim9script
1686 import './XexportRetarg.vim'
1687 def Lambda(): string
1688 var F = (x) => x->XexportRetarg.Retarg()
1689 return F('arg')
1690 enddef
1691 assert_equal('arg', Lambda())
1692 END
1693 v9.CheckScriptSuccess(lines)
Bram Moolenaar6ac69ed2022-09-03 12:09:07 +01001694enddef
1695
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001696def Test_export_shadows_global_function()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001697 mkdir('Xglobdir/autoload', 'pR')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001698 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001699 exe 'set rtp^=' .. getcwd() .. '/Xglobdir'
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001700
1701 var lines =<< trim END
1702 vim9script
1703 export def Shadow(): string
1704 return 'Shadow()'
1705 enddef
1706 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01001707 writefile(lines, 'Xglobdir/autoload/shadow.vim')
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001708
1709 lines =<< trim END
1710 vim9script
1711
1712 def g:Shadow(): string
1713 return 'global'
1714 enddef
1715
1716 import autoload 'shadow.vim'
1717 assert_equal('Shadow()', shadow.Shadow())
1718 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001719 v9.CheckScriptSuccess(lines)
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001720
1721 delfunc g:Shadow
1722 bwipe!
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001723 &rtp = save_rtp
1724enddef
1725
Bram Moolenaard8448622022-01-07 21:39:52 +00001726def Test_export_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001727 v9.CheckScriptFailure(['export var some = 123'], 'E1042:')
1728 v9.CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1729 v9.CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01001730 v9.CheckScriptFailure(['vim9script', 'export function /a1b2c3'], 'E1044:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001731
Bram Moolenaar5ab30012022-10-07 17:26:22 +01001732 assert_fails('export echo 1', 'E1043:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001733enddef
1734
1735func Test_import_fails_without_script()
1736 CheckRunVimInTerminal
1737
1738 " call indirectly to avoid compilation error for missing functions
1739 call Run_Test_import_fails_on_command_line()
1740endfunc
1741
1742def Run_Test_import_fails_on_command_line()
1743 var export =<< trim END
1744 vim9script
1745 export def Foo(): number
1746 return 0
1747 enddef
1748 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001749 writefile(export, 'XexportCmd.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001750
Bram Moolenaar62aec932022-01-29 21:45:34 +00001751 var buf = g:RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaard8448622022-01-07 21:39:52 +00001752 rows: 6, wait_for_ruler: 0})
Bram Moolenaar62aec932022-01-29 21:45:34 +00001753 g:WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaard8448622022-01-07 21:39:52 +00001754
Bram Moolenaar62aec932022-01-29 21:45:34 +00001755 g:StopVimInTerminal(buf)
Bram Moolenaard8448622022-01-07 21:39:52 +00001756enddef
1757
1758def Test_vim9_reload_noclear()
1759 var lines =<< trim END
1760 vim9script
1761 export var exported = 'thexport'
1762
1763 export def TheFunc(x = 0)
1764 enddef
1765 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001766 writefile(lines, 'XExportReload', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001767 lines =<< trim END
1768 vim9script noclear
1769 g:loadCount += 1
Bram Moolenaara749a422022-02-12 19:52:25 +00001770 var reloaded = 'init'
Bram Moolenaard8448622022-01-07 21:39:52 +00001771 import './XExportReload' as exp
1772
1773 def Again(): string
1774 return 'again'
1775 enddef
1776
1777 exp.TheFunc()
1778
Bram Moolenaara749a422022-02-12 19:52:25 +00001779 if exists('loaded') | finish | endif
1780 var loaded = true
Bram Moolenaard8448622022-01-07 21:39:52 +00001781
Bram Moolenaara749a422022-02-12 19:52:25 +00001782 var notReloaded = 'yes'
1783 reloaded = 'first'
Bram Moolenaard8448622022-01-07 21:39:52 +00001784 def g:Values(): list<string>
Bram Moolenaara749a422022-02-12 19:52:25 +00001785 return [reloaded, notReloaded, Again(), Once(), exp.exported]
Bram Moolenaard8448622022-01-07 21:39:52 +00001786 enddef
1787
1788 def Once(): string
1789 return 'once'
1790 enddef
1791 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001792 writefile(lines, 'XReloaded', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001793 g:loadCount = 0
1794 source XReloaded
1795 assert_equal(1, g:loadCount)
1796 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1797 source XReloaded
1798 assert_equal(2, g:loadCount)
1799 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1800 source XReloaded
1801 assert_equal(3, g:loadCount)
1802 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1803
Bram Moolenaard8448622022-01-07 21:39:52 +00001804 delfunc g:Values
1805 unlet g:loadCount
1806
1807 lines =<< trim END
1808 vim9script
1809 def Inner()
1810 enddef
1811 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001812 lines->writefile('XreloadScript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001813 source XreloadScript.vim
1814
1815 lines =<< trim END
1816 vim9script
1817 def Outer()
1818 def Inner()
1819 enddef
1820 enddef
1821 defcompile
1822 END
1823 lines->writefile('XreloadScript.vim')
1824 source XreloadScript.vim
Bram Moolenaard8448622022-01-07 21:39:52 +00001825enddef
1826
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001827def Test_vim_reload_noclear_arg_count()
1828 var lines =<< trim END
1829 vim9script noclear
1830
1831 if !exists('g:didload')
1832 def Test(a: string, b: string)
1833 echo a b
1834 enddef
1835 def Call()
1836 Test('a', 'b')
1837 enddef
1838 else
1839 # redefine with one argument less
1840 def Test(a: string)
1841 echo a
1842 enddef
1843 endif
1844 Call()
1845 g:didload = 1
1846 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001847 lines->writefile('XreloadScript_1.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001848 source XreloadScript_1.vim
1849 assert_fails('source XreloadScript_1.vim', 'E1106: One argument too many')
1850 unlet g:didload
1851
1852 lines =<< trim END
1853 vim9script noclear
1854
1855 if !exists('g:didload')
1856 def Test(a: string, b: string, c: string)
1857 echo a b
1858 enddef
1859 def Call()
1860 Test('a', 'b', 'c')
1861 enddef
1862 else
1863 # redefine with one argument less
1864 def Test(a: string)
1865 echo a
1866 enddef
1867 endif
1868 Call()
1869 g:didload = 1
1870 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001871 lines->writefile('XreloadScript_2.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001872 source XreloadScript_2.vim
1873 assert_fails('source XreloadScript_2.vim', 'E1106: 2 arguments too many')
1874 unlet g:didload
1875
1876 lines =<< trim END
1877 vim9script noclear
1878
1879 if !exists('g:didload')
1880 def Test(a: string)
1881 echo a
1882 enddef
1883 def Call()
1884 Test('a')
1885 enddef
1886 else
1887 # redefine with one argument extra
1888 def Test(a: string, b: string)
1889 echo a b
1890 enddef
1891 endif
1892 Call()
1893 g:didload = 1
1894 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001895 lines->writefile('XreloadScript_3.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001896 source XreloadScript_3.vim
1897 assert_fails('source XreloadScript_3.vim', 'E1190: One argument too few')
1898 unlet g:didload
1899
1900 lines =<< trim END
1901 vim9script noclear
1902
1903 if !exists('g:didload')
1904 def Test(a: string)
1905 echo a
1906 enddef
1907 def Call()
1908 Test('a')
1909 enddef
1910 else
1911 # redefine with two arguments extra
1912 def Test(a: string, b: string, c: string)
1913 echo a b
1914 enddef
1915 endif
1916 Call()
1917 g:didload = 1
1918 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001919 lines->writefile('XreloadScript_4.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001920 source XreloadScript_4.vim
1921 assert_fails('source XreloadScript_4.vim', 'E1190: 2 arguments too few')
1922 unlet g:didload
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001923enddef
1924
1925def Test_vim9_reload_noclear_error()
1926 var lines =<< trim END
1927 vim9script noclear
1928
1929 if !exists('g:didload')
1930 def Test(a: string)
1931 echo a
1932 enddef
1933 def Call()
1934 Test('a')
1935 enddef
1936 else
1937 # redefine with a compile error
1938 def Test(a: string)
1939 echo ax
1940 enddef
1941 endif
1942 Call()
1943 g:didload = 1
1944 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001945 lines->writefile('XreloadScriptErr.vim', 'D')
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001946 source XreloadScriptErr.vim
1947 assert_fails('source XreloadScriptErr.vim', 'E1001: Variable not found: ax')
1948
1949 unlet g:didload
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001950enddef
1951
Bram Moolenaard8448622022-01-07 21:39:52 +00001952def Test_vim9_reload_import()
1953 var lines =<< trim END
1954 vim9script
1955 const var = ''
1956 var valone = 1234
1957 def MyFunc(arg: string)
1958 valone = 5678
1959 enddef
1960 END
1961 var morelines =<< trim END
1962 var valtwo = 222
1963 export def GetValtwo(): number
1964 return valtwo
1965 enddef
1966 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001967 writefile(lines + morelines, 'Xreload.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001968 source Xreload.vim
1969 source Xreload.vim
1970 source Xreload.vim
1971
1972 # cannot declare a var twice
1973 lines =<< trim END
1974 vim9script
1975 var valone = 1234
1976 var valone = 5678
1977 END
1978 writefile(lines, 'Xreload.vim')
1979 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1980
Bram Moolenaard8448622022-01-07 21:39:52 +00001981 delete('Ximport.vim')
1982enddef
1983
1984" if a script is reloaded with a script-local variable that changed its type, a
1985" compiled function using that variable must fail.
1986def Test_script_reload_change_type()
1987 var lines =<< trim END
1988 vim9script noclear
1989 var str = 'string'
1990 def g:GetStr(): string
1991 return str .. 'xxx'
1992 enddef
1993 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01001994 writefile(lines, 'Xreload.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00001995 source Xreload.vim
1996 echo g:GetStr()
1997
1998 lines =<< trim END
1999 vim9script noclear
2000 var str = 1234
2001 END
2002 writefile(lines, 'Xreload.vim')
2003 source Xreload.vim
2004 assert_fails('echo g:GetStr()', 'E1150:')
2005
2006 delfunc g:GetStr
Bram Moolenaard8448622022-01-07 21:39:52 +00002007enddef
2008
2009" Define CallFunc so that the test can be compiled
2010command CallFunc echo 'nop'
2011
2012def Test_script_reload_from_function()
2013 var lines =<< trim END
2014 vim9script
2015
Bram Moolenaar10611952022-04-03 21:11:34 +01002016 if exists('g:loadedThis')
Bram Moolenaard8448622022-01-07 21:39:52 +00002017 finish
2018 endif
Bram Moolenaar10611952022-04-03 21:11:34 +01002019 g:loadedThis = 1
Bram Moolenaard8448622022-01-07 21:39:52 +00002020 delcommand CallFunc
2021 command CallFunc Func()
2022 def Func()
2023 so XreloadFunc.vim
2024 g:didTheFunc = 1
2025 enddef
2026 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002027 writefile(lines, 'XreloadFunc.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002028 source XreloadFunc.vim
2029 CallFunc
2030 assert_equal(1, g:didTheFunc)
2031
Bram Moolenaard8448622022-01-07 21:39:52 +00002032 delcommand CallFunc
Bram Moolenaar10611952022-04-03 21:11:34 +01002033 unlet g:loadedThis
Bram Moolenaard8448622022-01-07 21:39:52 +00002034 unlet g:didTheFunc
2035enddef
2036
2037def s:RetSome(): string
2038 return 'some'
2039enddef
2040
2041" Not exported function that is referenced needs to be accessed by the
2042" script-local name.
2043def Test_vim9_funcref()
2044 var sortlines =<< trim END
2045 vim9script
2046 def Compare(i1: number, i2: number): number
2047 return i2 - i1
2048 enddef
2049
2050 export def FastSort(): list<number>
2051 return range(5)->sort(Compare)
2052 enddef
2053
2054 export def GetString(arg: string): string
2055 return arg
2056 enddef
2057 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002058 writefile(sortlines, 'Xsort.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002059
2060 var lines =<< trim END
2061 vim9script
2062 import './Xsort.vim'
2063 def Test()
2064 g:result = Xsort.FastSort()
2065 enddef
2066 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002067 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002068 writefile(lines, 'Xscript.vim', 'D')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002069 source Xscript.vim
2070 assert_equal([4, 3, 2, 1, 0], g:result)
2071 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00002072
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00002073 lines =<< trim END
2074 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00002075 # using a function imported with "as"
2076 import './Xsort.vim' as anAlias
2077 assert_equal('yes', anAlias.GetString('yes'))
2078
2079 # using the function from a compiled function
2080 def TestMore(): string
2081 var s = s:anAlias.GetString('foo')
2082 return s .. anAlias.GetString('bar')
2083 enddef
2084 assert_equal('foobar', TestMore())
2085
2086 # error when using a function that isn't exported
2087 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
2088 END
2089 writefile(lines, 'Xscript.vim')
2090
Bram Moolenaard8448622022-01-07 21:39:52 +00002091 var Funcref = function('s:RetSome')
2092 assert_equal('some', Funcref())
2093enddef
2094
2095" Check that when searching for "FilterFunc" it finds the import in the
2096" script where FastFilter() is called from, both as a string and as a direct
2097" function reference.
2098def Test_vim9_funcref_other_script()
2099 var filterLines =<< trim END
2100 vim9script
2101 export def FilterFunc(idx: number, val: number): bool
2102 return idx % 2 == 1
2103 enddef
2104 export def FastFilter(): list<number>
2105 return range(10)->filter('FilterFunc(v:key, v:val)')
2106 enddef
2107 export def FastFilterDirect(): list<number>
2108 return range(10)->filter(FilterFunc)
2109 enddef
2110 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002111 writefile(filterLines, 'Xfilter.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002112
2113 var lines =<< trim END
2114 vim9script
2115 import './Xfilter.vim' as filter
2116 def Test()
2117 var x: list<number> = filter.FastFilter()
2118 enddef
2119 Test()
2120 def TestDirect()
2121 var x: list<number> = filter.FastFilterDirect()
2122 enddef
2123 TestDirect()
2124 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002125 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +00002126enddef
2127
2128def Test_import_absolute()
2129 var import_lines = [
2130 'vim9script',
2131 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
2132 'def UseExported()',
2133 ' g:imported_abs = abs.exported',
2134 ' abs.exported = 8888',
2135 ' g:imported_after = abs.exported',
2136 'enddef',
2137 'UseExported()',
2138 'g:import_disassembled = execute("disass UseExported")',
2139 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002140 writefile(import_lines, 'Ximport_abs.vim', 'D')
2141 writefile(s:export_script_lines, 'Xexport_abs.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002142
2143 source Ximport_abs.vim
2144
2145 assert_equal(9876, g:imported_abs)
2146 assert_equal(8888, g:imported_after)
2147 assert_match('<SNR>\d\+_UseExported\_s*' ..
2148 'g:imported_abs = abs.exported\_s*' ..
2149 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2150 '1 STOREG g:imported_abs\_s*' ..
2151 'abs.exported = 8888\_s*' ..
2152 '2 PUSHNR 8888\_s*' ..
2153 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
2154 'g:imported_after = abs.exported\_s*' ..
2155 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
2156 '5 STOREG g:imported_after',
2157 g:import_disassembled)
2158
2159 Undo_export_script_lines()
2160 unlet g:imported_abs
2161 unlet g:import_disassembled
Bram Moolenaard8448622022-01-07 21:39:52 +00002162enddef
2163
2164def Test_import_rtp()
2165 var import_lines = [
2166 'vim9script',
2167 'import "Xexport_rtp.vim" as rtp',
2168 'g:imported_rtp = rtp.exported',
2169 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002170 writefile(import_lines, 'Ximport_rtp.vim', 'D')
2171 mkdir('import', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +00002172 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
2173
2174 var save_rtp = &rtp
2175 &rtp = getcwd()
2176 source Ximport_rtp.vim
2177 &rtp = save_rtp
2178
2179 assert_equal(9876, g:imported_rtp)
2180
2181 Undo_export_script_lines()
2182 unlet g:imported_rtp
Bram Moolenaard8448622022-01-07 21:39:52 +00002183enddef
2184
2185def Test_import_compile_error()
2186 var export_lines = [
2187 'vim9script',
2188 'export def ExpFunc(): string',
2189 ' return notDefined',
2190 'enddef',
2191 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002192 writefile(export_lines, 'Xexported.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002193
2194 var import_lines = [
2195 'vim9script',
2196 'import "./Xexported.vim" as expo',
2197 'def ImpFunc()',
2198 ' echo expo.ExpFunc()',
2199 'enddef',
2200 'defcompile',
2201 ]
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002202 writefile(import_lines, 'Ximport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002203
2204 try
2205 source Ximport.vim
2206 catch /E1001/
2207 # Error should be before the Xexported.vim file.
2208 assert_match('E1001: Variable not found: notDefined', v:exception)
2209 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
2210 endtry
Bram Moolenaard8448622022-01-07 21:39:52 +00002211enddef
2212
2213def Test_func_overrules_import_fails()
2214 var export_lines =<< trim END
2215 vim9script
2216 export def Func()
2217 echo 'imported'
2218 enddef
2219 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002220 writefile(export_lines, 'XexportedFunc.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002221
2222 var lines =<< trim END
2223 vim9script
2224 import './XexportedFunc.vim' as Func
2225 def Func()
2226 echo 'local to function'
2227 enddef
2228 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002229 v9.CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00002230
2231 lines =<< trim END
2232 vim9script
2233 import './XexportedFunc.vim' as Func
2234 def Outer()
2235 def Func()
2236 echo 'local to function'
2237 enddef
2238 enddef
2239 defcompile
2240 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002241 v9.CheckScriptFailure(lines, 'E1236:')
Bram Moolenaard8448622022-01-07 21:39:52 +00002242enddef
2243
2244def Test_source_vim9_from_legacy()
2245 var vim9_lines =<< trim END
2246 vim9script
2247 var local = 'local'
2248 g:global = 'global'
2249 export var exported = 'exported'
2250 export def GetText(): string
2251 return 'text'
2252 enddef
2253 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002254 writefile(vim9_lines, 'Xvim9_script.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002255
2256 var legacy_lines =<< trim END
2257 source Xvim9_script.vim
2258
2259 call assert_false(exists('local'))
2260 call assert_false(exists('exported'))
2261 call assert_false(exists('s:exported'))
2262 call assert_equal('global', global)
2263 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00002264 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002265 writefile(legacy_lines, 'Xlegacy_script.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002266
2267 source Xlegacy_script.vim
2268 assert_equal('global', g:global)
2269 unlet g:global
Bram Moolenaarb775e722022-11-22 18:12:44 +00002270
2271 legacy_lines =<< trim END
2272 import './Xvim9_script.vim'
2273 let g:global = s:Xvim9_script.GetText()
2274 END
2275 writefile(legacy_lines, 'Xlegacyimport.vim', 'D')
2276 source Xlegacyimport.vim
2277 assert_equal('text', g:global)
2278 unlet g:global
Bram Moolenaard8448622022-01-07 21:39:52 +00002279enddef
2280
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002281def Test_import_vim9_from_legacy()
2282 var vim9_lines =<< trim END
2283 vim9script
2284 var local = 'local'
2285 g:global = 'global'
2286 export var exported = 'exported'
2287 export def GetText(): string
2288 return 'text'
2289 enddef
Yegappan Lakshmananf1750ca2024-04-02 20:41:04 +02002290 export var exported_nr: number = 22
2291 def AddNum(n: number)
2292 exported_nr += n
2293 enddef
2294 export var exportedDict: dict<func> = {Fn: AddNum}
2295 export const CONST = 10
2296 export final finalVar = 'abc'
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002297 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002298 writefile(vim9_lines, 'Xvim9_export.vim', 'D')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002299
2300 var legacy_lines =<< trim END
2301 import './Xvim9_export.vim' as vim9
2302
2303 call assert_false(exists('vim9'))
2304 call assert_false(exists('local'))
2305 call assert_false(exists('s:vim9.local'))
2306 call assert_equal('global', global)
2307 call assert_equal('global', g:global)
2308 call assert_false(exists('exported'))
2309 call assert_false(exists('s:exported'))
2310 call assert_false(exists('*GetText'))
2311
2312 " imported symbol is script-local
2313 call assert_equal('exported', s:vim9.exported)
2314 call assert_equal('text', s:vim9.GetText())
Yegappan Lakshmananf1750ca2024-04-02 20:41:04 +02002315 call s:vim9.exportedDict.Fn(5)
2316 call assert_equal(27, s:vim9.exported_nr)
2317 call call(s:vim9.exportedDict.Fn, [3])
2318 call assert_equal(30, s:vim9.exported_nr)
2319 call assert_fails('let s:vim9.CONST = 20', 'E46: Cannot change read-only variable "CONST"')
2320 call assert_fails('let s:vim9.finalVar = ""', 'E46: Cannot change read-only variable "finalVar"')
2321 call assert_fails('let s:vim9.non_existing_var = 20', 'E1048: Item not found in script: non_existing_var')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002322 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002323 writefile(legacy_lines, 'Xlegacy_script.vim', 'D')
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002324
2325 source Xlegacy_script.vim
2326 assert_equal('global', g:global)
2327 unlet g:global
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002328enddef
2329
Bram Moolenaard8448622022-01-07 21:39:52 +00002330def Test_cmdline_win()
2331 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
2332 # the command line window.
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002333 mkdir('rtp/syntax', 'pR')
Bram Moolenaard8448622022-01-07 21:39:52 +00002334 var export_lines =<< trim END
2335 vim9script
2336 export var That = 'yes'
2337 END
2338 writefile(export_lines, 'rtp/syntax/Xexport.vim')
2339 var import_lines =<< trim END
2340 vim9script
2341 import './Xexport.vim' as exp
2342 echo exp.That
2343 END
2344 writefile(import_lines, 'rtp/syntax/vim.vim')
2345 var save_rtp = &rtp
2346 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
2347 syntax on
2348 augroup CmdWin
2349 autocmd CmdwinEnter * g:got_there = 'yes'
2350 augroup END
2351 # this will open and also close the cmdline window
2352 feedkeys('q:', 'xt')
2353 assert_equal('yes', g:got_there)
2354
2355 augroup CmdWin
2356 au!
2357 augroup END
2358 &rtp = save_rtp
Bram Moolenaard8448622022-01-07 21:39:52 +00002359enddef
2360
2361def Test_import_gone_when_sourced_twice()
2362 var exportlines =<< trim END
2363 vim9script
2364 if exists('g:guard')
2365 finish
2366 endif
2367 g:guard = 1
2368 export var name = 'someName'
2369 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002370 writefile(exportlines, 'XexportScript.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002371
2372 var lines =<< trim END
2373 vim9script
2374 import './XexportScript.vim' as expo
2375 def g:GetName(): string
2376 return expo.name
2377 enddef
2378 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002379 writefile(lines, 'XscriptImport.vim', 'D')
Bram Moolenaard8448622022-01-07 21:39:52 +00002380 so XscriptImport.vim
2381 assert_equal('someName', g:GetName())
2382
2383 so XexportScript.vim
2384 assert_fails('call g:GetName()', 'E1149:')
2385
2386 delfunc g:GetName
Bram Moolenaard8448622022-01-07 21:39:52 +00002387 unlet g:guard
2388enddef
2389
Bram Moolenaar160aa862022-01-10 21:29:57 +00002390" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002391def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002392 var lines =<< trim END
2393 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002394 export def Gettest(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002395 return 'test'
2396 enddef
2397 g:some#name = 'name'
2398 g:some#dict = {key: 'value'}
2399
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002400 export def Varargs(a1: string, ...l: list<string>): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002401 return a1 .. l[0] .. l[1]
2402 enddef
2403 END
2404
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002405 mkdir('Xfulldir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002406 writefile(lines, 'Xfulldir/autoload/some.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002407 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002408 exe 'set rtp^=' .. getcwd() .. '/Xfulldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002409
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002410 assert_equal('test', g:some#Gettest())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002411 assert_equal('name', g:some#name)
2412 assert_equal('value', g:some#dict.key)
2413 g:some#other = 'other'
2414 assert_equal('other', g:some#other)
2415
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002416 assert_equal('abc', some#Varargs('a', 'b', 'c'))
Bram Moolenaar160aa862022-01-10 21:29:57 +00002417
2418 # upper case script name works
2419 lines =<< trim END
2420 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002421 export def GetOther(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002422 return 'other'
2423 enddef
2424 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002425 writefile(lines, 'Xfulldir/autoload/Other.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002426 assert_equal('other', g:Other#GetOther())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002427
Bram Moolenaar160aa862022-01-10 21:29:57 +00002428 &rtp = save_rtp
2429enddef
2430
2431def Test_vim9script_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002432 mkdir('Xaldir/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002433 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002434 exe 'set rtp^=' .. getcwd() .. '/Xaldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002435
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002436 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00002437 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002438 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002439 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00002440
2441 export def Gettest(): string
2442 return 'test'
2443 enddef
2444
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002445 export var name = 'name'
2446
2447 export func GetFunc()
2448 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00002449 endfunc
2450
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002451 export def GetDef(): string
2452 return Gettest() .. 'more' .. name
2453 enddef
2454
Bram Moolenaar160aa862022-01-10 21:29:57 +00002455 export final fname = 'final'
2456 export const cname = 'const'
2457 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002458 writefile(lines, 'Xaldir/autoload/prefixed.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002459
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002460 g:prefixed_loaded = 0
2461 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00002462 lines =<< trim END
2463 vim9script
2464 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002465 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002466 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002467 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002468
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002469 assert_equal('testmorename', prefixed.GetFunc())
2470 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002471 assert_equal('name', prefixed.name)
2472 assert_equal('final', prefixed.fname)
2473 assert_equal('const', prefixed.cname)
2474 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002475 v9.CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002476 # can source it again, autoload script not loaded again
2477 g:expected_loaded = 1
Bram Moolenaar62aec932022-01-29 21:45:34 +00002478 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002479
2480 # can also get the items by autoload name
2481 lines =<< trim END
2482 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002483 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002484 call assert_equal('name', prefixed#name)
2485 call assert_equal('final', prefixed#fname)
2486 call assert_equal('const', prefixed#cname)
2487 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002488 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002489
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002490 unlet g:prefixed_loaded
2491 unlet g:expected_loaded
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002492 &rtp = save_rtp
2493enddef
2494
Bram Moolenaard02dce22022-01-18 17:43:04 +00002495def Test_import_autoload_not_exported()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002496 mkdir('Xnimdir/autoload', 'pR')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002497 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002498 exe 'set rtp^=' .. getcwd() .. '/Xnimdir'
Bram Moolenaard02dce22022-01-18 17:43:04 +00002499
2500 # error when using an item that is not exported from an autoload script
2501 var exportLines =<< trim END
2502 vim9script
2503 var notExported = 123
2504 def NotExport()
2505 echo 'nop'
2506 enddef
2507 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002508 writefile(exportLines, 'Xnimdir/autoload/notExport1.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002509
2510 var lines =<< trim END
2511 vim9script
2512 import autoload 'notExport1.vim'
2513 echo notExport1.notFound
2514 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002515 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002516
2517 lines =<< trim END
2518 vim9script
2519 import autoload 'notExport1.vim'
2520 echo notExport1.notExported
2521 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002522 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002523
2524 lines =<< trim END
2525 vim9script
2526 import autoload 'notExport1.vim'
2527 echo notExport1.NotFunc()
2528 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002529 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002530
2531 lines =<< trim END
2532 vim9script
2533 import autoload 'notExport1.vim'
2534 echo notExport1.NotExport()
2535 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002536 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002537
2538 lines =<< trim END
2539 vim9script
2540 import autoload 'notExport1.vim'
2541 echo 'text'->notExport1.NotFunc()
2542 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002543 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002544
2545 lines =<< trim END
2546 vim9script
2547 import autoload 'notExport1.vim'
2548 echo 'text'->notExport1.NotExport()
2549 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002550 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002551
2552 # using a :def function we use a different autoload script every time so that
2553 # the function is compiled without the script loaded
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002554 writefile(exportLines, 'Xnimdir/autoload/notExport2.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002555 lines =<< trim END
2556 vim9script
2557 import autoload 'notExport2.vim'
2558 def Testit()
2559 echo notExport2.notFound
2560 enddef
2561 Testit()
2562 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002563 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002564
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002565 writefile(exportLines, 'Xnimdir/autoload/notExport3.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002566 lines =<< trim END
2567 vim9script
2568 import autoload 'notExport3.vim'
2569 def Testit()
2570 echo notExport3.notExported
2571 enddef
2572 Testit()
2573 END
2574 # don't get E1049 because it is too complicated to figure out
Bram Moolenaar62aec932022-01-29 21:45:34 +00002575 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002576
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002577 writefile(exportLines, 'Xnimdir/autoload/notExport4.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002578 lines =<< trim END
2579 vim9script
2580 import autoload 'notExport4.vim'
2581 def Testit()
2582 echo notExport4.NotFunc()
2583 enddef
2584 Testit()
2585 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002586 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002587
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002588 writefile(exportLines, 'Xnimdir/autoload/notExport5.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002589 lines =<< trim END
2590 vim9script
2591 import autoload 'notExport5.vim'
2592 def Testit()
2593 echo notExport5.NotExport()
2594 enddef
2595 Testit()
2596 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002597 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002598
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002599 writefile(exportLines, 'Xnimdir/autoload/notExport6.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002600 lines =<< trim END
2601 vim9script
2602 import autoload 'notExport6.vim'
2603 def Testit()
2604 echo 'text'->notExport6.NotFunc()
2605 enddef
2606 Testit()
2607 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002608 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002609
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002610 writefile(exportLines, 'Xnimdir/autoload/notExport7.vim')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002611 lines =<< trim END
2612 vim9script
2613 import autoload 'notExport7.vim'
2614 def Testit()
2615 echo 'text'->notExport7.NotExport()
2616 enddef
2617 Testit()
2618 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002619 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002620
Bram Moolenaard02dce22022-01-18 17:43:04 +00002621 &rtp = save_rtp
2622enddef
2623
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002624def Test_vim9script_autoload_call()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002625 mkdir('Xcalldir/autoload', 'pR')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002626 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002627 exe 'set rtp^=' .. getcwd() .. '/Xcalldir'
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002628
2629 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002630 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002631
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002632 export def RetArg(arg: string): string
2633 return arg
2634 enddef
2635
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002636 export def Getother()
2637 g:result = 'other'
2638 enddef
2639 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002640 writefile(lines, 'Xcalldir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002641
2642 lines =<< trim END
2643 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00002644 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002645
2646 # compile this before 'another.vim' is loaded
2647 def CallAnother()
2648 assert_equal('foo', 'foo'->another.RetArg())
2649 enddef
2650 CallAnother()
2651
Bram Moolenaar5d982692022-01-12 15:15:27 +00002652 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002653 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00002654
2655 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaar8164f6e2022-02-06 13:08:41 +00002656
2657 verbose function another.Getother
2658 # should we disallow this?
2659 verbose function another#Getother
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002660 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002661 v9.CheckScriptSuccess(lines)
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002662
2663 unlet g:result
Bram Moolenaar160aa862022-01-10 21:29:57 +00002664 &rtp = save_rtp
2665enddef
2666
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002667def Test_vim9script_noclear_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002668 mkdir('Xnocdir/autoload', 'pR')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002669 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002670 exe 'set rtp^=' .. getcwd() .. '/Xnocdir'
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002671
2672 var lines =<< trim END
2673 vim9script
2674 export def Func(): string
2675 return 'called'
2676 enddef
2677 g:double_loaded = 'yes'
2678 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002679 writefile(lines, 'Xnocdir/autoload/double.vim')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002680
2681 lines =<< trim END
2682 vim9script noclear
2683 if exists('g:script_loaded')
2684 finish
2685 endif
2686 g:script_loaded = true
2687
2688 import autoload 'double.vim'
2689 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
2690 END
2691 g:double_loaded = 'no'
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002692 writefile(lines, 'Xloaddouble', 'D')
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002693 source Xloaddouble
2694 assert_equal('no', g:double_loaded)
2695 assert_equal(true, g:script_loaded)
2696 source Xloaddouble
2697 feedkeys("\<F3>", 'xt')
2698 assert_equal('called', g:result)
2699 assert_equal('yes', g:double_loaded)
2700
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002701 unlet g:double_loaded
2702 unlet g:script_loaded
2703 unlet g:result
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002704 &rtp = save_rtp
2705enddef
2706
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002707def Test_vim9script_autoload_duplicate()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002708 mkdir('Xdupdir/autoload', 'pR')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002709
2710 var lines =<< trim END
2711 vim9script
2712
2713 export def Func()
2714 enddef
2715
2716 def Func()
2717 enddef
2718 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002719 writefile(lines, 'Xdupdir/autoload/dupfunc.vim')
2720 assert_fails('source Xdupdir/autoload/dupfunc.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002721
2722 lines =<< trim END
2723 vim9script
2724
2725 def Func()
2726 enddef
2727
2728 export def Func()
2729 enddef
2730 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002731 writefile(lines, 'Xdupdir/autoload/dup2func.vim')
2732 assert_fails('source Xdupdir/autoload/dup2func.vim', 'E1073:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002733
2734 lines =<< trim END
2735 vim9script
2736
2737 def Func()
2738 enddef
2739
2740 export var Func = 'asdf'
2741 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002742 writefile(lines, 'Xdupdir/autoload/dup3func.vim')
2743 assert_fails('source Xdupdir/autoload/dup3func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002744
2745 lines =<< trim END
2746 vim9script
2747
2748 export var Func = 'asdf'
2749
2750 def Func()
2751 enddef
2752 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002753 writefile(lines, 'Xdupdir/autoload/dup4func.vim')
Bram Moolenaar6c4d4a62022-10-13 17:47:42 +01002754 assert_fails('source Xdupdir/autoload/dup4func.vim', 'E1041:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002755
2756 lines =<< trim END
2757 vim9script
2758
2759 var Func = 'asdf'
2760
2761 export def Func()
2762 enddef
2763 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002764 writefile(lines, 'Xdupdir/autoload/dup5func.vim')
2765 assert_fails('source Xdupdir/autoload/dup5func.vim', 'E707:')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002766
2767 lines =<< trim END
2768 vim9script
2769
2770 export def Func()
2771 enddef
2772
2773 var Func = 'asdf'
2774 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002775 writefile(lines, 'Xdupdir/autoload/dup6func.vim')
2776 assert_fails('source Xdupdir/autoload/dup6func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002777enddef
2778
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002779def Test_autoload_missing_function_name()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002780 mkdir('Xmisdir/autoload', 'pR')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002781
2782 var lines =<< trim END
2783 vim9script
2784
2785 def loadme#()
2786 enddef
2787 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002788 writefile(lines, 'Xmisdir/autoload/loadme.vim')
2789 assert_fails('source Xmisdir/autoload/loadme.vim', 'E129:')
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002790enddef
2791
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002792def Test_autoload_name_wrong()
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002793 var lines =<< trim END
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002794 def Xscriptname#Func()
2795 enddef
2796 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002797 writefile(lines, 'Xscriptname.vim', 'D')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002798 v9.CheckScriptFailure(lines, 'E746:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002799
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002800 mkdir('Xwrodir/autoload', 'pR')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002801 lines =<< trim END
2802 vim9script
2803 def somescript#Func()
2804 enddef
2805 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002806 writefile(lines, 'Xwrodir/autoload/somescript.vim')
2807 assert_fails('source Xwrodir/autoload/somescript.vim', 'E1263:')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002808
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002809 delete('Xwrodir', 'rf')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002810enddef
2811
Bram Moolenaard041f422022-01-12 19:54:00 +00002812def Test_import_autoload_postponed()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002813 mkdir('Xpostdir/autoload', 'pR')
Bram Moolenaard041f422022-01-12 19:54:00 +00002814 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002815 exe 'set rtp^=' .. getcwd() .. '/Xpostdir'
Bram Moolenaard041f422022-01-12 19:54:00 +00002816
2817 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002818 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00002819
2820 g:loaded_postponed = 'true'
2821 export var variable = 'bla'
2822 export def Function(): string
2823 return 'bla'
2824 enddef
2825 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002826 writefile(lines, 'Xpostdir/autoload/postponed.vim')
Bram Moolenaard041f422022-01-12 19:54:00 +00002827
2828 lines =<< trim END
2829 vim9script
2830
2831 import autoload 'postponed.vim'
2832 def Tryit()
2833 echo postponed.variable
2834 echo postponed.Function()
2835 enddef
2836 defcompile
2837 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002838 v9.CheckScriptSuccess(lines)
Bram Moolenaard041f422022-01-12 19:54:00 +00002839 assert_false(exists('g:loaded_postponed'))
Bram Moolenaar62aec932022-01-29 21:45:34 +00002840 v9.CheckScriptSuccess(lines + ['Tryit()'])
Bram Moolenaard041f422022-01-12 19:54:00 +00002841 assert_equal('true', g:loaded_postponed)
2842
2843 unlet g:loaded_postponed
Bram Moolenaard041f422022-01-12 19:54:00 +00002844 &rtp = save_rtp
2845enddef
2846
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002847def Test_import_autoload_override()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002848 mkdir('Xoverdir/autoload', 'pR')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002849 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002850 exe 'set rtp^=' .. getcwd() .. '/Xoverdir'
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002851 test_override('autoload', 1)
2852
2853 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002854 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002855
2856 g:loaded_override = 'true'
2857 export var variable = 'bla'
2858 export def Function(): string
2859 return 'bla'
2860 enddef
2861 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002862 writefile(lines, 'Xoverdir/autoload/override.vim')
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002863
2864 lines =<< trim END
2865 vim9script
2866
2867 import autoload 'override.vim'
2868 assert_equal('true', g:loaded_override)
2869
2870 def Tryit()
2871 echo override.doesNotExist
2872 enddef
2873 defcompile
2874 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002875 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002876
2877 test_override('autoload', 0)
2878 unlet g:loaded_override
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002879 &rtp = save_rtp
2880enddef
2881
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002882def Test_autoload_mapping()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002883 mkdir('Xmapdir/autoload', 'pR')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002884 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002885 exe 'set rtp^=' .. getcwd() .. '/Xmapdir'
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002886
2887 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002888 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002889
2890 g:toggle_loaded = 'yes'
2891
2892 export def Toggle(): string
2893 return ":g:toggle_called = 'yes'\<CR>"
2894 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002895 export def Doit()
2896 g:doit_called = 'yes'
2897 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002898 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002899 writefile(lines, 'Xmapdir/autoload/toggle.vim')
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002900
2901 lines =<< trim END
2902 vim9script
2903
2904 import autoload 'toggle.vim'
2905
Bram Moolenaar94722c52023-01-28 19:19:03 +00002906 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002907 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2908 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002909 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002910 v9.CheckScriptSuccess(lines)
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002911 assert_false(exists("g:toggle_loaded"))
2912 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002913 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002914
2915 feedkeys("tt", 'xt')
2916 assert_equal('yes', g:toggle_loaded)
2917 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002918 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002919
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002920 feedkeys("xx", 'xt')
2921 assert_equal('yes', g:doit_called)
2922
2923 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2924
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002925 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002926 nunmap xx
2927 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002928 unlet g:toggle_loaded
2929 unlet g:toggle_called
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002930 &rtp = save_rtp
2931enddef
2932
Bram Moolenaar160aa862022-01-10 21:29:57 +00002933def Test_vim9script_autoload_fails()
2934 var lines =<< trim END
2935 vim9script autoload
2936 var n = 0
2937 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002938 v9.CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002939
2940 lines =<< trim END
2941 vim9script noclear noclear
2942 var n = 0
2943 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002944 v9.CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01002945
2946 lines =<< trim END
2947 vim9script noclears
2948 var n = 0
2949 END
2950 v9.CheckScriptFailure(lines, 'E475: Invalid argument: noclears')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002951enddef
2952
2953def Test_import_autoload_fails()
2954 var lines =<< trim END
2955 vim9script
2956 import autoload autoload 'prefixed.vim'
2957 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002958 v9.CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002959
2960 lines =<< trim END
2961 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002962 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002963 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002964 v9.CheckScriptFailure(lines, 'E282:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002965
2966 lines =<< trim END
2967 vim9script
2968 import autoload '/dir/doesNotExist.vim'
2969 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002970 v9.CheckScriptFailure(lines, 'E282:', 2)
2971
2972 lines =<< trim END
2973 vim9script
2974 import autoload '../testdir'
2975 END
2976 v9.CheckScriptFailure(lines, 'E17:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002977
2978 lines =<< trim END
2979 vim9script
2980 import autoload 'doesNotExist.vim'
2981 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002982 v9.CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002983enddef
2984
2985" test disassembling an auto-loaded function starting with "debug"
2986def Test_vim9_autoload_disass()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002987 mkdir('Xdasdir/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002988 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002989 exe 'set rtp^=' .. getcwd() .. '/Xdasdir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002990
2991 var lines =<< trim END
2992 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002993 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002994 return 'debug'
2995 enddef
2996 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01002997 writefile(lines, 'Xdasdir/autoload/debugit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002998
2999 lines =<< trim END
3000 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003001 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00003002 return 'profile'
3003 enddef
3004 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003005 writefile(lines, 'Xdasdir/autoload/profileit.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003006
3007 lines =<< trim END
3008 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003009 assert_equal('debug', debugit#Test())
3010 disass debugit#Test
3011 assert_equal('profile', profileit#Test())
3012 disass profileit#Test
Bram Moolenaar160aa862022-01-10 21:29:57 +00003013 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003014 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00003015
Bram Moolenaar160aa862022-01-10 21:29:57 +00003016 &rtp = save_rtp
3017enddef
3018
3019" test using a vim9script that is auto-loaded from an autocmd
3020def Test_vim9_aucmd_autoload()
3021 var lines =<< trim END
3022 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003023 export def Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00003024 echomsg getreg('"')
3025 enddef
3026 END
3027
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003028 mkdir('Xauldir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003029 writefile(lines, 'Xauldir/autoload/foo.vim')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003030 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003031 exe 'set rtp^=' .. getcwd() .. '/Xauldir'
Bram Moolenaar160aa862022-01-10 21:29:57 +00003032 augroup test
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00003033 autocmd TextYankPost * call foo#Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00003034 augroup END
3035
3036 normal Y
3037
3038 augroup test
3039 autocmd!
3040 augroup END
Bram Moolenaar160aa862022-01-10 21:29:57 +00003041 &rtp = save_rtp
3042enddef
3043
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003044" test using a autoloaded file that is case sensitive
3045def Test_vim9_autoload_case_sensitive()
3046 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00003047 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003048 export def CaseSensitive(): string
3049 return 'done'
3050 enddef
3051 END
3052
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003053 mkdir('Xcasedir/autoload', 'pR')
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003054 writefile(lines, 'Xcasedir/autoload/CaseSensitive.vim')
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003055 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +01003056 exe 'set rtp^=' .. getcwd() .. '/Xcasedir'
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003057
3058 lines =<< trim END
3059 vim9script
3060 import autoload 'CaseSensitive.vim'
3061 assert_equal('done', CaseSensitive.CaseSensitive())
3062 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003063 v9.CheckScriptSuccess(lines)
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003064
Bram Moolenaarbfac4092022-01-16 11:12:12 +00003065 if !has('fname_case')
3066 lines =<< trim END
3067 vim9script
3068 import autoload 'CaseSensitive.vim'
3069 import autoload 'casesensitive.vim'
3070 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003071 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaarbfac4092022-01-16 11:12:12 +00003072 endif
3073
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00003074 &rtp = save_rtp
3075enddef
3076
Bram Moolenaar160aa862022-01-10 21:29:57 +00003077" This was causing a crash because suppress_errthrow wasn't reset.
3078def Test_vim9_autoload_error()
3079 var lines =<< trim END
3080 vim9script
3081 def crash#func()
3082 try
3083 for x in List()
3084 endfor
3085 catch
3086 endtry
3087 g:ok = true
3088 enddef
3089 fu List()
3090 invalid
3091 endfu
3092 try
3093 alsoinvalid
3094 catch /wontmatch/
3095 endtry
3096 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003097 call mkdir('Xruntime/autoload', 'pR')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003098 call writefile(lines, 'Xruntime/autoload/crash.vim')
3099
3100 # run in a separate Vim to avoid the side effects of assert_fails()
3101 lines =<< trim END
3102 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
3103 call crash#func()
3104 call writefile(['ok'], 'Xdidit')
3105 qall!
3106 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003107 writefile(lines, 'Xscript', 'D')
Bram Moolenaar62aec932022-01-29 21:45:34 +00003108 g:RunVim([], [], '-S Xscript')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003109 assert_equal(['ok'], readfile('Xdidit'))
3110
3111 delete('Xdidit')
Bram Moolenaar160aa862022-01-10 21:29:57 +00003112
3113 lines =<< trim END
3114 vim9script
3115 var foo#bar = 'asdf'
3116 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00003117 v9.CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar160aa862022-01-10 21:29:57 +00003118enddef
3119
Bram Moolenaar753885b2022-08-24 16:30:36 +01003120def Test_vim9_import_symlink()
3121 if !has('unix')
3122 CheckUnix
3123 else
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003124 mkdir('Xto/plugin', 'pR')
Bram Moolenaar753885b2022-08-24 16:30:36 +01003125 var lines =<< trim END
3126 vim9script
3127 import autoload 'bar.vim'
nwounkn36b66762024-06-02 16:10:07 +02003128 def FooFunc(): string
3129 return bar.Func()
3130 enddef
3131 g:resultFunc = FooFunc()
Bram Moolenaar753885b2022-08-24 16:30:36 +01003132 g:resultValue = bar.value
3133 END
3134 writefile(lines, 'Xto/plugin/foo.vim')
3135
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003136 mkdir('Xto/autoload', 'pR')
Bram Moolenaar753885b2022-08-24 16:30:36 +01003137 lines =<< trim END
3138 vim9script
3139 export def Func(): string
3140 return 'func'
3141 enddef
3142 export var value = 'val'
3143 END
3144 writefile(lines, 'Xto/autoload/bar.vim')
3145
3146 var save_rtp = &rtp
3147 &rtp = getcwd() .. '/Xfrom'
3148 system('ln -s ' .. getcwd() .. '/Xto Xfrom')
3149
3150 source Xfrom/plugin/foo.vim
3151 assert_equal('func', g:resultFunc)
3152 assert_equal('val', g:resultValue)
3153
3154 var infoTo = getscriptinfo()->filter((_, v) => v.name =~ 'Xto/autoload/bar')
3155 var infoFrom = getscriptinfo()->filter((_, v) => v.name =~ 'Xfrom/autoload/bar')
3156 assert_equal(1, len(infoTo))
3157 assert_equal(1, len(infoFrom))
3158 assert_equal(infoTo[0].sid, infoFrom[0].sourced)
Bram Moolenaar7ea9fcb2022-08-24 17:46:12 +01003159 var output: string
3160 redir => output
3161 scriptnames
3162 redir END
3163 assert_match(infoFrom[0].sid .. '->' .. infoFrom[0].sourced .. '.*Xfrom', output)
Bram Moolenaar753885b2022-08-24 16:30:36 +01003164
3165 unlet g:resultFunc
3166 unlet g:resultValue
3167 &rtp = save_rtp
Bram Moolenaar753885b2022-08-24 16:30:36 +01003168 delete('Xfrom', 'rf')
Ernie Rael9a901792024-04-16 22:11:56 +02003169
3170 # Access item from :def imported through symbolic linked directory. #14536
3171 mkdir('Xto/real_dir', 'pR')
3172 lines =<< trim END
3173 vim9script
3174 export const val = 17
3175 export def F(): number
3176 return 23
3177 enddef
3178 END
3179 writefile(lines, 'Xto/real_dir/real_file.vim')
3180 system('ln -s real_dir Xto/syml_dir')
3181 defer delete('Xto/syml_dir')
3182 lines =<< trim END
3183 vim9script
3184 import autoload './Xto/syml_dir/real_file.vim'
3185
3186 def Fmain()
3187 assert_equal(17, real_file.val)
3188 enddef
3189 def F2()
3190 assert_equal(23, real_file.F())
3191 enddef
3192 Fmain()
3193 F2()
3194 END
3195 v9.CheckScriptSuccess(lines)
Bram Moolenaar753885b2022-08-24 16:30:36 +01003196 endif
3197enddef
3198
LemonBoy90c27b22023-08-27 19:28:15 +02003199def Test_export_in_conditional_block()
3200 var lines =<< trim END
3201 vim9script
3202 if exists('this_will_fail')
3203 export var MyVar = "hello"
3204 endif
3205 END
3206 v9.CheckScriptSuccess(lines)
3207enddef
3208
Yegappan Lakshmananfa630082024-03-10 19:22:38 +01003209" Import fails when an autoloaded script is imported again.
3210" Github issue #14171
3211def Test_import_autloaded_script()
3212 mkdir('Ximporttwice', 'pR')
3213 mkdir('Ximporttwice/plugin')
3214 mkdir('Ximporttwice/autoload')
3215 var save_rtp = &rtp
3216 exe 'set rtp^=' .. getcwd() .. '/Ximporttwice'
3217
3218 var lines =<< trim END
3219 vim9script
3220
3221 export def H(): number
3222 return 10
3223 enddef
3224 END
3225 writefile(lines, 'Ximporttwice/autoload/hello.vim')
3226
3227 lines =<< trim END
3228 vim9script
3229
3230 import "./hello.vim"
3231 export def W(): number
3232 return 20
3233 enddef
3234 END
3235 writefile(lines, 'Ximporttwice/autoload/world.vim')
3236
3237 lines =<< trim END
3238 vim9script
3239
3240 import autoload '../autoload/hello.vim'
3241 import autoload '../autoload/world.vim'
3242
3243 command Hello echo hello.H()
3244 command World echo world.W()
3245 END
3246 writefile(lines, 'Ximporttwice/plugin/main.vim')
3247
3248 lines =<< trim END
3249 vim9script
3250
3251 source ./Ximporttwice/plugin/main.vim
3252 assert_equal(['20'], execute('World')->split("\n"))
3253 END
3254 v9.CheckScriptSuccess(lines)
3255
3256 &rtp = save_rtp
3257enddef
Bram Moolenaard8448622022-01-07 21:39:52 +00003258
Yegappan Lakshmanan3fa8f772024-04-04 21:42:07 +02003259" Test for autoloading an imported dict func
3260def Test_autoload_import_dict_func()
3261 mkdir('Xdir/autoload', 'pR')
3262 var lines =<< trim END
3263 vim9script
3264 export var al_exported_nr: number = 33
3265 def Al_AddNum(n: number)
3266 al_exported_nr += n
3267 enddef
3268 export var al_exportedDict: dict<func> = {Fn: Al_AddNum}
3269 END
3270 writefile(lines, 'Xdir/autoload/Xdictfunc.vim')
3271
3272 var save_rtp = &rtp
3273 exe 'set rtp^=' .. getcwd() .. '/Xdir'
3274 lines =<< trim END
3275 import './Xdir/autoload/Xdictfunc.vim'
3276 call Xdictfunc#al_exportedDict.Fn(5)
3277 call assert_equal(38, Xdictfunc#al_exported_nr)
3278 call call(Xdictfunc#al_exportedDict.Fn, [3])
3279 call assert_equal(41, Xdictfunc#al_exported_nr)
3280 END
3281 v9.CheckScriptSuccess(lines)
3282 &rtp = save_rtp
3283enddef
3284
Yegappan Lakshmanan9937d8b2024-05-08 20:24:33 +02003285" Test for changing the value of an imported Dict item
3286def Test_set_imported_dict_item()
3287 var lines =<< trim END
3288 vim9script
3289 export var dict1: dict<bool> = {bflag: false}
3290 export var dict2: dict<dict<bool>> = {x: {bflag: false}}
3291 END
3292 writefile(lines, 'XimportedDict.vim', 'D')
3293
3294 lines =<< trim END
3295 vim9script
3296 import './XimportedDict.vim'
3297 assert_equal(XimportedDict.dict1.bflag, false)
3298 XimportedDict.dict1.bflag = true
3299 assert_equal(XimportedDict.dict1.bflag, true)
3300 XimportedDict.dict2.x.bflag = true
3301 assert_equal(XimportedDict.dict2.x.bflag, true)
3302 assert_equal('bool', typename(XimportedDict.dict1.bflag))
3303 assert_equal('bool', typename(XimportedDict.dict2.x.bflag))
3304 assert_equal('bool', typename(XimportedDict.dict2['x'].bflag))
3305 assert_equal('bool', typename(XimportedDict.dict2.x['bflag']))
3306
3307 assert_equal(XimportedDict.dict1['bflag'], true)
3308 XimportedDict.dict1['bflag'] = false
3309 assert_equal(XimportedDict.dict1.bflag, false)
3310 XimportedDict.dict2['x']['bflag'] = false
3311 assert_equal(XimportedDict.dict2['x'].bflag, false)
3312 END
3313 v9.CheckScriptSuccess(lines)
3314
3315 lines =<< trim END
3316 vim9script
3317 import './XimportedDict.vim'
3318 XimportedDict.dict2.x.bflag = []
3319 END
3320 v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected bool but got list<any>', 3)
3321enddef
3322
3323" Test for changing the value of an imported class member
3324def Test_set_imported_class_member()
3325 var lines =<< trim END
3326 vim9script
3327 export class Config
3328 public static var option = false
3329 endclass
3330 END
3331 writefile(lines, 'XimportedClass.vim', 'D')
3332
3333 lines =<< trim END
3334 vim9script
3335 import './XimportedClass.vim' as foo
3336 type FooConfig = foo.Config
3337 assert_equal(false, FooConfig.option)
3338 assert_equal(false, foo.Config.option)
3339 foo.Config.option = true
3340 assert_equal(true, foo.Config.option)
3341 assert_equal(true, FooConfig.option)
3342 END
3343 v9.CheckScriptSuccess(lines)
3344enddef
3345
Yegappan Lakshmanan8c35c262024-05-10 13:10:54 +02003346" Test for using an imported function from the vimrc file.  The function is
3347" defined in the 'start' directory of a package.
3348def Test_import_from_vimrc()
3349 mkdir('Ximport/pack/foobar/start/foo/autoload', 'pR')
3350 var lines =<< trim END
3351 vim9script
3352 export def Foo()
3353 writefile(['Foo called'], 'Xoutput.log')
3354 enddef
3355 END
3356 writefile(lines, 'Ximport/pack/foobar/start/foo/autoload/foo.vim')
3357 lines =<< trim END
3358 vim9script
3359 set packpath+=./Ximport
3360 try
3361 import autoload 'foo.vim'
3362 foo.Foo()
3363 catch
3364 writefile(['Failed to import foo.vim'], 'Xoutput.log')
3365 endtry
3366 qall!
3367 END
3368 writefile(lines, 'Xvimrc', 'D')
3369 g:RunVim([], [], '-u Xvimrc')
3370 assert_equal(['Foo called'], readfile('Xoutput.log'))
3371 delete('Xoutput.log')
3372enddef
3373
Yegappan Lakshmananfe424d12024-05-17 18:20:43 +02003374" Test for changing a locked imported variable
3375def Test_import_locked_var()
3376 var lines =<< trim END
3377 vim9script
3378 export var Foo: number = 10
3379 lockvar Foo
3380 END
3381 writefile(lines, 'Ximportlockedvar.vim', 'D')
3382 lines =<< trim END
3383 vim9script
3384 import './Ximportlockedvar.vim' as Bar
3385 Bar.Foo = 20
3386 END
3387 v9.CheckScriptFailure(lines, 'E741: Value is locked: Foo', 3)
3388enddef
3389
Yegappan Lakshmanand79ea472025-01-20 21:09:13 +01003390" Test for using an autoload imported class as the function return type
3391def Test_imported_class_as_def_func_rettype()
3392 var lines =<< trim END
3393 vim9script
3394
3395 export class Foo
3396 var name: string = "foo"
3397 endclass
3398 END
3399 writefile(lines, 'Ximportclassrettype1.vim', 'D')
3400
3401 lines =<< trim END
3402 vim9script
3403
3404 import autoload "./Ximportclassrettype1.vim" as A
3405
3406 export def CreateFoo(): A.Foo
3407 return A.Foo.new()
3408 enddef
3409 END
3410 writefile(lines, 'Ximportclassrettype2.vim', 'D')
3411
3412 lines =<< trim END
3413 vim9script
3414
3415 import './Ximportclassrettype2.vim' as B
3416
3417 var foo = B.CreateFoo()
3418 assert_equal('foo', foo.name)
3419 END
3420 v9.CheckScriptSuccess(lines)
3421enddef
3422
Hirohito Higashi645a4282025-02-09 16:41:23 +01003423" Test for don't crash when using a combination of import and class extends
3424def Test_vim9_import_and_class_extends()
3425 var lines =<< trim END
3426 vim9script
3427 import './cccc.vim'
3428 export class Property extends cccc.Run
3429 public var value: string
3430 def new(this.value)
3431 cccc.Run.value2 = this.value
3432 enddef
3433 endclass
3434 END
3435 writefile(lines, './aaaa.vim', 'D')
3436
3437 lines =<< trim END
3438 vim9script
3439 export class Run
3440 public var value2: string
3441 def new(this.value)
3442 enddef
3443 endclass
3444 END
3445 writefile(lines, './cccc.vim', 'D')
3446
3447 lines =<< trim END
3448 vim9script
3449 import './aaaa.vim'
3450 class View
3451 var content = aaaa.Property.new('')
3452 endclass
3453
3454 var myView = View.new('This should be ok')
3455 assert_equal('This should be ok', myView.content.value)
3456 END
Yegappan Lakshmanan54d7f182025-02-10 21:35:07 +01003457 v9.CheckScriptFailure(lines, 'E1376: Object variable "value2" accessible only using class "Run" object', 2)
Hirohito Higashi645a4282025-02-09 16:41:23 +01003458enddef
3459
Hirohito Higashibf7c88d2025-02-13 21:04:07 +01003460" Test for import and class extends
3461def Test_vim9_import_and_class_extends_2()
3462 mkdir('import', 'R')
3463 var save_rtp = &rtp
3464 &rtp = getcwd()
3465
3466 var lines =<< trim END
3467 vim9script
3468 export class Property
3469 public var value: string
3470 endclass
3471 END
3472 writefile(lines, './import/libproperty.vim')
3473
3474 lines =<< trim END
3475 vim9script
3476 import 'libproperty.vim'
3477 export class View
3478 var _content = libproperty.Property.new('')
3479 endclass
3480 END
3481 writefile(lines, './import/libview.vim')
3482
3483 lines =<< trim END
3484 vim9script
3485 import 'libview.vim'
3486 class MyView extends libview.View
3487 def new(value: string)
3488 this._content.value = value
3489 enddef
3490 endclass
3491 var myView = MyView.new('This should be ok')
3492 END
3493 v9.CheckScriptSuccess(lines)
3494 &rtp = save_rtp
3495enddef
3496
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003497" Test for using an imported class as a type
3498def Test_use_imported_class_as_type()
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003499 mkdir('Xdir', 'R')
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003500 mkdir('Xdir/autoload', 'D')
3501 mkdir('Xdir/import', 'D')
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003502 var lines =<< trim END
3503 vim9script
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003504 export class B
3505 var foo: string
3506 def new()
3507 this.foo = 'bar'
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003508 enddef
3509 endclass
3510 END
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003511 writefile(lines, 'Xdir/autoload/b.vim')
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003512
3513 lines =<< trim END
3514 vim9script
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003515 import autoload '../autoload/b.vim'
3516 export class A
3517 final AO: b.B = b.B.new()
3518 endclass
3519 var a = A.new()
3520 assert_equal('bar', a.AO.foo)
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003521 END
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003522 writefile(lines, 'Xdir/import/a.vim')
3523 source Xdir/import/a.vim
Yegappan Lakshmanan778ada42025-02-17 20:21:23 +01003524enddef
3525
Yegappan Lakshmanane3fed482025-02-20 22:20:54 +01003526" FIXME: The following test currently fails.
3527" " Test for using an autoloaded class from another autoloaded script
3528" def Test_class_from_auloaded_script()
3529" mkdir('Xdir', 'R')
3530" var save_rtp = &rtp
3531" &rtp = getcwd()
3532" exe 'set rtp^=' .. getcwd() .. '/Xdir'
3533"
3534" mkdir('Xdir/autoload/SomeClass/bar', 'p')
3535"
3536" var lines =<< trim END
3537" vim9script
3538"
3539" export class Baz
3540" static var v1: string = "v1"
3541" var v2: string = "v2"
3542" def GetName(): string
3543" return "baz"
3544" enddef
3545" endclass
3546" END
3547" writefile(lines, 'Xdir/autoload/SomeClass/bar/baz.vim', 'D')
3548"
3549" lines =<< trim END
3550" vim9script
3551"
3552" import autoload './bar/baz.vim'
3553"
3554" export def MyTestFoo(): string
3555" assert_fails('var x = baz.Baz.NonExisting()', 'E1325: Method "NonExisting" not found in class "Baz"')
3556" assert_fails('var x = baz.Baz.foobar', 'E1337: Class variable "foobar" not found in class "Baz"')
3557"
3558" const instance = baz.Baz.new()
3559" return $'{instance.GetName()} {baz.Baz.v1} {instance.v2}'
3560" enddef
3561" END
3562" writefile(lines, 'Xdir/autoload/SomeClass/foo.vim', 'D')
3563"
3564" lines =<< trim END
3565" vim9script
3566"
3567" import autoload 'SomeClass/foo.vim'
3568" import autoload 'SomeClass/bar/baz.vim'
3569"
3570" def NotInAutoload()
3571" # Use non-existing class method and variable
3572" assert_fails('var x = baz.Baz.NonExisting()', 'E1325: Method "NonExisting" not found in class "Baz"')
3573"
3574" var caught_exception = false
3575" try
3576" var x = baz.Baz.foobar
3577" catch /E1337: Class variable "foobar" not found in class "Baz"/
3578" caught_exception = true
3579" endtry
3580" assert_true(caught_exception)
3581"
3582" const instance = baz.Baz.new()
3583" assert_equal("baz v1 v2", $'{instance.GetName()} {baz.Baz.v1} {instance.v2}')
3584" enddef
3585"
3586" def InAutoload()
3587" assert_equal("baz v1 v2", foo.MyTestFoo())
3588" enddef
3589"
3590" NotInAutoload()
3591" InAutoload()
3592" END
3593" v9.CheckScriptSuccess(lines)
3594"
3595" &rtp = save_rtp
3596" enddef
3597
Yegappan Lakshmanan16f2d3a2025-02-24 19:23:43 +01003598" Test for using a non-exported constant as an instance variable initiazer in an
3599" imported class
3600def Test_import_member_initializer()
3601 var lines =<< trim END
3602 vim9script
3603 const DEFAULT = 'default'
3604 export class Foo
3605 public var x = DEFAULT
3606 endclass
3607 END
3608 writefile(lines, 'Ximportclass.vim', 'D')
3609
3610 # The initializer for Foo.x is evaluated in the context of Ximportclass.vim.
3611 lines =<< trim END
3612 vim9script
3613 import './Ximportclass.vim' as X
3614 class Bar extends X.Foo
3615 endclass
3616 var o = Bar.new()
3617 assert_equal('default', o.x)
3618 END
3619 v9.CheckScriptSuccess(lines)
3620
3621 # Another test
3622 lines =<< trim END
3623 vim9script
3624
3625 export interface IObjKey
3626 var unique_object_id: string
3627 endinterface
3628
3629 # helper sub-class.
3630 export class ObjKey implements IObjKey
3631 const unique_object_id = GenerateKey()
3632 endclass
3633
3634 export def GenerateKey(): string
3635 return "SomeKey"
3636 enddef
3637 END
3638 writefile(lines, 'XobjKey.vim', 'D')
3639
3640 lines =<< trim END
3641 vim9script
3642
3643 import "./XobjKey.vim" as obj_key
3644
3645 const GenKey = obj_key.GenerateKey
3646
3647 class LocalObjKey implements obj_key.IObjKey
3648 const unique_object_id = GenKey()
3649 endclass
3650
3651 type Key1 = obj_key.ObjKey
3652 type Key2 = LocalObjKey
3653
3654 class C1 extends Key1
3655 endclass
3656 class C2 extends Key2
3657 endclass
3658 assert_equal('SomeKey', C1.new().unique_object_id)
3659 assert_equal('SomeKey', C2.new().unique_object_id)
3660 END
3661 v9.CheckScriptSuccess(lines)
3662enddef
3663
Bram Moolenaard8448622022-01-07 21:39:52 +00003664" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker