blob: f28b4adef30b0572220dc5adcf1d1f54d811e311 [file] [log] [blame]
Bram Moolenaard8448622022-01-07 21:39:52 +00001" Test import/export of the Vim9 script language.
Bram Moolenaar160aa862022-01-10 21:29:57 +00002" Also the autoload mechanism.
Bram Moolenaard8448622022-01-07 21:39:52 +00003
4source check.vim
5source term_util.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00006import './vim9.vim' as v9
Bram Moolenaard8448622022-01-07 21:39:52 +00007
8let s:export_script_lines =<< trim END
9 vim9script
10 var name: string = 'bob'
11 def Concat(arg: string): string
12 return name .. arg
13 enddef
14 g:result = Concat('bie')
15 g:localname = name
16
17 export const CONST = 1234
18 export var exported = 9876
19 export var exp_name = 'John'
20 export def Exported(): string
21 return 'Exported'
22 enddef
23 export def ExportedValue(): number
24 return exported
25 enddef
26 export def ExportedInc()
27 exported += 5
28 enddef
29 export final theList = [1]
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000030 export def AddSome(s: string): string
31 return s .. 'some'
32 enddef
33 export var AddRef = AddSome
Bram Moolenaard8448622022-01-07 21:39:52 +000034END
35
Bram Moolenaar62aec932022-01-29 21:45:34 +000036def s:Undo_export_script_lines()
Bram Moolenaard8448622022-01-07 21:39:52 +000037 unlet g:result
38 unlet g:localname
39enddef
40
41def Test_vim9_import_export()
42 writefile(s:export_script_lines, 'Xexport.vim')
43 var import_script_lines =<< trim END
44 vim9script
45 var dir = './'
46 var ext = ".vim"
47 import dir .. 'Xexport' .. ext as expo
48
49 g:exported1 = expo.exported
50 expo.exported += 3
51 g:exported2 = expo.exported
52 g:exported3 = expo.ExportedValue()
53
54 expo.ExportedInc()
55 g:exported_i1 = expo.exported
56 g:exported_i2 = expo.ExportedValue()
57
58 expo.exported = 11
59 g:exported_s1 = expo.exported
60 g:exported_s2 = expo.ExportedValue()
61
62 g:imported_func = expo.Exported()
63
64 def GetExported(): string
65 var local_dict = {ref: expo.Exported}
66 return local_dict.ref()
67 enddef
68 g:funcref_result = GetExported()
69
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +000070 def GetName(): string
71 return expo.exp_name .. 'son'
72 enddef
73 g:long_name = GetName()
74
Bram Moolenaard8448622022-01-07 21:39:52 +000075 g:imported_name = expo.exp_name
76 expo.exp_name ..= ' Doe'
Bram Moolenaar47036b62022-01-16 21:18:53 +000077 expo.exp_name = expo.exp_name .. ' Maar'
Bram Moolenaard8448622022-01-07 21:39:52 +000078 g:imported_name_appended = expo.exp_name
79 g:exported_later = expo.exported
80
81 expo.theList->add(2)
82 assert_equal([1, 2], expo.theList)
Bram Moolenaar857c8bb2022-01-15 21:08:19 +000083
84 assert_equal('andthensome', 'andthen'->expo.AddSome())
85 assert_equal('awesome', 'awe'->expo.AddRef())
Bram Moolenaard8448622022-01-07 21:39:52 +000086 END
87 writefile(import_script_lines, 'Ximport.vim')
88 source Ximport.vim
89
90 assert_equal('bobbie', g:result)
91 assert_equal('bob', g:localname)
92 assert_equal(9876, g:exported1)
93 assert_equal(9879, g:exported2)
94 assert_equal(9879, g:exported3)
95
96 assert_equal(9884, g:exported_i1)
97 assert_equal(9884, g:exported_i2)
98
99 assert_equal(11, g:exported_s1)
100 assert_equal(11, g:exported_s2)
101 assert_equal(11, g:exported_later)
102
103 assert_equal('Exported', g:imported_func)
104 assert_equal('Exported', g:funcref_result)
105 assert_equal('John', g:imported_name)
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +0000106 assert_equal('Johnson', g:long_name)
Bram Moolenaar47036b62022-01-16 21:18:53 +0000107 assert_equal('John Doe Maar', g:imported_name_appended)
Bram Moolenaard8448622022-01-07 21:39:52 +0000108 assert_false(exists('g:name'))
109
110 Undo_export_script_lines()
111 unlet g:exported1
112 unlet g:exported2
113 unlet g:exported3
114 unlet g:exported_i1
115 unlet g:exported_i2
116 unlet g:exported_later
117 unlet g:imported_func
Bram Moolenaar21f0d6c2022-01-20 17:35:49 +0000118 unlet g:imported_name g:long_name g:imported_name_appended
Bram Moolenaard8448622022-01-07 21:39:52 +0000119 delete('Ximport.vim')
120
121 # similar, with line breaks
122 var import_line_break_script_lines =<< trim END
123 vim9script
124 import './Xexport.vim'
125 as expo
126 g:exported = expo.exported
127 expo.exported += 7
128 g:exported_added = expo.exported
129 g:imported_func = expo.Exported()
130 END
131 writefile(import_line_break_script_lines, 'Ximport_lbr.vim')
132 source Ximport_lbr.vim
133
134 assert_equal(11, g:exported)
135 assert_equal(18, g:exported_added)
136 assert_equal('Exported', g:imported_func)
137
138 # exported script not sourced again
139 assert_false(exists('g:result'))
140 unlet g:exported
141 unlet g:exported_added
142 unlet g:imported_func
143 delete('Ximport_lbr.vim')
144
Bram Moolenaar68854a82022-01-31 18:59:13 +0000145 var import_shadows_cmdmod_lines =<< trim END
146 vim9script
147 import './Xexport.vim' as vim9
148 vim9.exp_name = 'Shadow'
149 assert_equal('Shadow', vim9.exp_name)
150 END
151 v9.CheckScriptSuccess(import_shadows_cmdmod_lines)
152
Bram Moolenaard8448622022-01-07 21:39:52 +0000153 var line_break_before_dot =<< trim END
154 vim9script
155 import './Xexport.vim' as expo
156 g:exported = expo
157 .exported
158 END
159 writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
160 assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
161 delete('Ximport_lbr_before_dot.vim')
162
163 var line_break_after_dot =<< trim END
164 vim9script
165 import './Xexport.vim' as expo
166 g:exported = expo.
167 exported
168 END
169 writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
170 assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
171 delete('Ximport_lbr_after_dot.vim')
172
173 var import_star_as_lines =<< trim END
174 vim9script
175 import './Xexport.vim' as Export
176 def UseExport()
177 g:exported_def = Export.exported
178 enddef
179 g:exported_script = Export.exported
180 assert_equal(1, exists('Export.exported'))
181 assert_equal(0, exists('Export.notexported'))
182 UseExport()
183 END
184 writefile(import_star_as_lines, 'Ximport.vim')
185 source Ximport.vim
186
187 assert_equal(18, g:exported_def)
188 assert_equal(18, g:exported_script)
189 unlet g:exported_def
190 unlet g:exported_script
191
192 var import_star_as_lines_no_dot =<< trim END
193 vim9script
194 import './Xexport.vim' as Export
195 def Func()
196 var dummy = 1
197 var imported = Export + dummy
198 enddef
199 defcompile
200 END
201 writefile(import_star_as_lines_no_dot, 'Ximport.vim')
202 assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func')
203
204 var import_star_as_lines_dot_space =<< trim END
205 vim9script
206 import './Xexport.vim' as Export
207 def Func()
208 var imported = Export . exported
209 enddef
210 defcompile
211 END
212 writefile(import_star_as_lines_dot_space, 'Ximport.vim')
213 assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func')
214
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000215 writefile(s:export_script_lines, 'Xexport2.vim')
216 var import_as_duplicated =<< trim END
Bram Moolenaard8448622022-01-07 21:39:52 +0000217 vim9script
218 import './Xexport.vim' as expo
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000219 import './Xexport2.vim' as expo
Bram Moolenaard8448622022-01-07 21:39:52 +0000220 END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000221 writefile(import_as_duplicated, 'Ximport.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000222 assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000223 delete('Xexport2.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000224
225 var import_star_as_lines_script_no_dot =<< trim END
226 vim9script
227 import './Xexport.vim' as Export
228 g:imported_script = Export exported
229 END
230 writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
231 assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
232
233 var import_star_as_lines_script_space_after_dot =<< trim END
234 vim9script
235 import './Xexport.vim' as Export
236 g:imported_script = Export. exported
237 END
238 writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim')
239 assert_fails('source Ximport.vim', 'E1074:')
240
241 var import_star_as_lines_missing_name =<< trim END
242 vim9script
243 import './Xexport.vim' as Export
244 def Func()
245 var imported = Export.
246 enddef
247 defcompile
248 END
249 writefile(import_star_as_lines_missing_name, 'Ximport.vim')
250 assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func')
251
252 var import_star_as_lbr_lines =<< trim END
253 vim9script
254 import './Xexport.vim'
255 as Export
256 def UseExport()
257 g:exported = Export.exported
258 enddef
259 UseExport()
260 END
261 writefile(import_star_as_lbr_lines, 'Ximport.vim')
262 source Ximport.vim
263 assert_equal(18, g:exported)
264 unlet g:exported
265
266 # try to use something that exists but is not exported
267 var import_not_exported_lines =<< trim END
268 vim9script
269 import './Xexport.vim' as expo
270 echo expo.name
271 END
272 writefile(import_not_exported_lines, 'Ximport.vim')
273 assert_fails('source Ximport.vim', 'E1049:', '', 3, 'Ximport.vim')
274
275 # try to import something that is already defined
276 var import_already_defined =<< trim END
277 vim9script
278 var exported = 'something'
279 import './Xexport.vim' as exported
280 END
281 writefile(import_already_defined, 'Ximport.vim')
282 assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim')
283
284 # try changing an imported const
285 var import_assign_to_const =<< trim END
286 vim9script
287 import './Xexport.vim' as expo
288 def Assign()
289 expo.CONST = 987
290 enddef
291 defcompile
292 END
293 writefile(import_assign_to_const, 'Ximport.vim')
294 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
295
296 # try changing an imported final
297 var import_assign_to_final =<< trim END
298 vim9script
299 import './Xexport.vim' as expo
300 def Assign()
301 expo.theList = [2]
302 enddef
303 defcompile
304 END
305 writefile(import_assign_to_final, 'Ximport.vim')
306 assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign')
307
308 var import_no_as_lines =<< trim END
309 vim9script
310 import './Xexport.vim' name
311 END
312 writefile(import_no_as_lines, 'Ximport.vim')
313 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
314
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100315 # trailing starts with "as"
316 var import_bad_as_lines =<< trim END
317 vim9script
318 import './Xexport.vim' asname
319 END
320 writefile(import_no_as_lines, 'Ximport.vim')
321 assert_fails('source Ximport.vim', 'E488:', '', 2, 'Ximport.vim')
322
Bram Moolenaard8448622022-01-07 21:39:52 +0000323 var import_invalid_string_lines =<< trim END
324 vim9script
325 import Xexport.vim
326 END
327 writefile(import_invalid_string_lines, 'Ximport.vim')
328 assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim')
329
330 var import_wrong_name_lines =<< trim END
331 vim9script
332 import './XnoExport.vim'
333 END
334 writefile(import_wrong_name_lines, 'Ximport.vim')
335 assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim')
336
337 var import_redefining_lines =<< trim END
338 vim9script
339 import './Xexport.vim' as exported
340 var exported = 5
341 END
342 writefile(import_redefining_lines, 'Ximport.vim')
343 assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3)
344
Bram Moolenaar160aa862022-01-10 21:29:57 +0000345 var import_missing_dot_lines =<< trim END
346 vim9script
347 import './Xexport.vim' as expo
348 def Test()
349 expo = 9
350 enddef
351 defcompile
352 END
353 writefile(import_missing_dot_lines, 'Ximport.vim')
354 assert_fails('source Ximport.vim', 'E1258:', '', 1)
355
356 var import_missing_name_lines =<< trim END
357 vim9script
358 import './Xexport.vim' as expo
359 def Test()
360 expo.99 = 9
361 enddef
362 defcompile
363 END
364 writefile(import_missing_name_lines, 'Ximport.vim')
Bram Moolenaar76283822022-01-10 21:39:03 +0000365 assert_fails('source Ximport.vim', 'E1259:', '', 1)
Bram Moolenaar160aa862022-01-10 21:29:57 +0000366
Bram Moolenaard8448622022-01-07 21:39:52 +0000367 var import_assign_wrong_type_lines =<< trim END
368 vim9script
369 import './Xexport.vim' as expo
370 expo.exported = 'xxx'
371 END
372 writefile(import_assign_wrong_type_lines, 'Ximport.vim')
373 assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3)
374
375 var import_assign_const_lines =<< trim END
376 vim9script
377 import './Xexport.vim' as expo
378 expo.CONST = 4321
379 END
380 writefile(import_assign_const_lines, 'Ximport.vim')
381 assert_fails('source Ximport.vim', 'E46: Cannot change read-only variable "CONST"', '', 3)
382
383 delete('Ximport.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000384 delete('Xexport.vim')
385
386 # Check that in a Vim9 script 'cpo' is set to the Vim default.
387 # Flags added or removed are also applied to the restored value.
388 set cpo=abcd
389 var lines =<< trim END
390 vim9script
391 g:cpo_in_vim9script = &cpo
392 set cpo+=f
393 set cpo-=c
394 g:cpo_after_vim9script = &cpo
395 END
396 writefile(lines, 'Xvim9_script')
397 source Xvim9_script
398 assert_equal('fabd', &cpo)
399 set cpo&vim
400 assert_equal(&cpo, g:cpo_in_vim9script)
401 var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
402 assert_equal(newcpo, g:cpo_after_vim9script)
403
404 delete('Xvim9_script')
405enddef
406
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100407def Test_import_very_long_name()
408 var lines =<< trim END
409 vim9script
410
411 export var verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname = 'asdf'
412 END
413 writefile(lines, 'Xverylong.vim')
414
415 lines =<< trim END
416 vim9script
417 import './Xverylong.vim'
418
419 g:result = Xverylong.verylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongnameverylongname
420 END
421 v9.CheckScriptSuccess(lines)
422 assert_equal('asdf', g:result)
423
424 delete('Xverylong.vim')
425 unlet g:result
426enddef
427
Bram Moolenaard8448622022-01-07 21:39:52 +0000428def Test_import_funcref()
429 var lines =<< trim END
430 vim9script
431 export def F(): number
432 return 42
433 enddef
434 export const G = F
435 END
436 writefile(lines, 'Xlib.vim')
437
438 lines =<< trim END
439 vim9script
440 import './Xlib.vim' as lib
441 const Foo = lib.G()
442 assert_equal(42, Foo)
443
444 def DoTest()
445 const Goo = lib.G()
446 assert_equal(42, Goo)
447 enddef
448 DoTest()
449 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000450 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000451
452 delete('Xlib.vim')
453enddef
454
Bram Moolenaarc2f17f72022-02-21 13:13:50 +0000455def Test_import_duplicate_function()
456 # Function Hover() exists in both scripts, partial should refer to the right
457 # one.
458 var lines =<< trim END
459 vim9script
460
461 def Hover(d: dict<any>): string
462 return 'found it'
463 enddef
464
465 export def NewLspServer(): dict<any>
466 var d: dict<any> = {}
467 d->extend({hover: function('Hover', [d])})
468 return d
469 enddef
470
471 NewLspServer()
472 END
473 writefile(lines, 'Xserver.vim')
474
475 lines =<< trim END
476 vim9script
477
478 import './Xserver.vim' as server
479
480 export def Hover()
481 enddef
482
483 def AddServer()
484 var d: dict<any> = server.NewLspServer()
485 assert_equal('found it', d.hover())
486 enddef
487 AddServer()
488 END
489 v9.CheckScriptSuccess(lines)
490
491 delete('Xserver.vim')
492enddef
493
494
Bram Moolenaard8448622022-01-07 21:39:52 +0000495def Test_import_fails()
496 writefile([], 'Xfoo.vim')
497 var lines =<< trim END
498 import './Xfoo.vim' as foo
499 foo = 'bar'
500 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000501 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use foo itself'])
Bram Moolenaard8448622022-01-07 21:39:52 +0000502 lines =<< trim END
503 vim9script
504 import './Xfoo.vim' as foo
505 var that = foo
506 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000507 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000508 lines =<< trim END
509 vim9script
510 import './Xfoo.vim' as foo
511 var that: any
512 that += foo
513 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000514 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaardd5893b2022-01-20 21:32:54 +0000515 lines =<< trim END
516 vim9script
517 import './Xfoo.vim' as foo
518 foo += 9
519 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000520 v9.CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
Bram Moolenaard8448622022-01-07 21:39:52 +0000521
522 lines =<< trim END
523 vim9script
524 import './Xfoo.vim' as 9foo
525 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000526 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000527 lines =<< trim END
528 vim9script
529 import './Xfoo.vim' as the#foo
530 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000531 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000532 lines =<< trim END
533 vim9script
534 import './Xfoo.vim' as g:foo
535 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000536 v9.CheckScriptFailure(lines, 'E1047:')
Bram Moolenaard8448622022-01-07 21:39:52 +0000537
Bram Moolenaard8448622022-01-07 21:39:52 +0000538 lines =<< trim END
539 vim9script
540 def TheFunc()
541 echo 'the func'
542 enddef
543 export var Ref = TheFunc
544 END
545 writefile([], 'Xthat.vim')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000546
Bram Moolenaard8448622022-01-07 21:39:52 +0000547 lines =<< trim END
548 import './Xthat.vim' as That
549 That()
550 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000551 v9.CheckDefAndScriptFailure(lines, ['E1094:', 'E1236: Cannot use That itself'])
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000552
553 lines =<< trim END
Bram Moolenaar937610b2022-01-19 17:21:29 +0000554 vim9script
555 import './Xthat.vim' as That
556 def Func()
557 echo That()
558 enddef
559 Func()
560 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000561 v9.CheckScriptFailure(lines, 'E1236: Cannot use That itself')
Bram Moolenaar937610b2022-01-19 17:21:29 +0000562
563 lines =<< trim END
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000564 import './Xthat.vim' as one
565 import './Xthat.vim' as two
566 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000567 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +0000568
569 delete('Xthat.vim')
Bram Moolenaar779aeff2022-02-08 19:12:19 +0000570
571 lines =<< trim END
572 vim9script
573 export var item = 'hello'
574 import './Xyourself.vim'
575 END
576 writefile(lines, 'Xyourself.vim')
577 assert_fails('source Xyourself.vim', 'E1088:')
578 delete('Xyourself.vim')
579
Bram Moolenaard8448622022-01-07 21:39:52 +0000580 mkdir('Ximport')
581
582 writefile(['vim9script'], 'Ximport/.vim')
583 lines =<< trim END
584 vim9script
585 import './Ximport/.vim'
586 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000587 v9.CheckScriptFailure(lines, 'E1261: Cannot import .vim without using "as"')
Bram Moolenaard8448622022-01-07 21:39:52 +0000588 lines =<< trim END
589 vim9script
590 import './Ximport/.vim' as vim
591 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000592 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000593
594 writefile(['vim9script'], 'Ximport/.vimrc')
595 lines =<< trim END
596 vim9script
597 import './Ximport/.vimrc'
598 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000599 v9.CheckScriptFailure(lines, 'E1257: Imported script must use "as" or end in .vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000600 lines =<< trim END
601 vim9script
602 import './Ximport/.vimrc' as vimrc
603 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000604 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +0000605
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100606 new
607 setline(1, ['vim9script', 'import "" as abc'])
608 assert_fails('source', 'E1071: Invalid string for :import: "" as abc')
609 setline(2, 'import [] as abc')
610 assert_fails('source', 'E1071: Invalid string for :import: [] as abc')
611 setline(2, 'import test_null_string() as abc')
612 assert_fails('source', 'E1071: Invalid string for :import: test_null_string() as abc')
613 bw!
614 call writefile(['vim9script', "import './Xfoo.vim' ask expo"], 'Xbar.vim')
615 assert_fails('source Xbar.vim', 'E488: Trailing characters: ask expo')
616 writefile([], 'Xtemp')
617 call writefile(['vim9script', "import './Xtemp'"], 'Xbar.vim')
618 assert_fails('source Xbar.vim', 'E1257: Imported script must use "as" or end in .vim: Xtemp')
619 delete('Xtemp')
620 call writefile(['vim9script', "import './Xfoo.vim' as abc | foobar"], 'Xbar.vim')
621 assert_fails('source Xbar.vim', 'E492: Not an editor command: foobar')
622 call delete('Xbar.vim')
623
Bram Moolenaard8448622022-01-07 21:39:52 +0000624 delete('Ximport', 'rf')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100625 delete('Xfoo.vim')
Bram Moolenaard8448622022-01-07 21:39:52 +0000626enddef
627
628func g:Trigger()
629 source Ximport.vim
630 return "echo 'yes'\<CR>"
631endfunc
632
633def Test_import_export_expr_map()
634 # check that :import and :export work when buffer is locked
635 var export_lines =<< trim END
636 vim9script
637 export def That(): string
638 return 'yes'
639 enddef
640 END
641 writefile(export_lines, 'Xexport_that.vim')
642
643 var import_lines =<< trim END
644 vim9script
645 import './Xexport_that.vim' as that
646 assert_equal('yes', that.That())
647 END
648 writefile(import_lines, 'Ximport.vim')
649
650 nnoremap <expr> trigger g:Trigger()
651 feedkeys('trigger', "xt")
652
653 delete('Xexport_that.vim')
654 delete('Ximport.vim')
655 nunmap trigger
656enddef
657
658def Test_import_in_filetype()
659 # check that :import works when the buffer is locked
660 mkdir('ftplugin', 'p')
661 var export_lines =<< trim END
662 vim9script
663 export var That = 'yes'
664 END
665 writefile(export_lines, 'ftplugin/Xexport_ft.vim')
666
667 var import_lines =<< trim END
668 vim9script
669 import './Xexport_ft.vim' as ft
670 assert_equal('yes', ft.That)
671 g:did_load_mytpe = 1
672 END
673 writefile(import_lines, 'ftplugin/qf.vim')
674
675 var save_rtp = &rtp
676 &rtp = getcwd() .. ',' .. &rtp
677
678 filetype plugin on
679 copen
680 assert_equal(1, g:did_load_mytpe)
681
682 quit!
683 delete('Xexport_ft.vim')
684 delete('ftplugin', 'rf')
685 &rtp = save_rtp
686enddef
687
688def Test_use_import_in_mapping()
689 var lines =<< trim END
690 vim9script
Bram Moolenaar89445512022-04-14 12:58:23 +0100691 export def Funcx(nr: number)
692 g:result = nr
Bram Moolenaard8448622022-01-07 21:39:52 +0000693 enddef
694 END
695 writefile(lines, 'XsomeExport.vim')
696 lines =<< trim END
697 vim9script
698 import './XsomeExport.vim' as some
699 var Funcy = some.Funcx
Bram Moolenaar89445512022-04-14 12:58:23 +0100700 nnoremap <F3> :call <sid>Funcy(42)<cr>
701 nnoremap <F4> :call <sid>some.Funcx(44)<cr>
Bram Moolenaard8448622022-01-07 21:39:52 +0000702 END
703 writefile(lines, 'Xmapscript.vim')
704
705 source Xmapscript.vim
706 feedkeys("\<F3>", "xt")
707 assert_equal(42, g:result)
Bram Moolenaar89445512022-04-14 12:58:23 +0100708 feedkeys("\<F4>", "xt")
709 assert_equal(44, g:result)
Bram Moolenaard8448622022-01-07 21:39:52 +0000710
711 unlet g:result
712 delete('XsomeExport.vim')
713 delete('Xmapscript.vim')
714 nunmap <F3>
Bram Moolenaar89445512022-04-14 12:58:23 +0100715 nunmap <F4>
716enddef
717
Bram Moolenaar648dd882022-04-14 21:36:15 +0100718def Test_use_relative_autoload_import_in_mapping()
Bram Moolenaar89445512022-04-14 12:58:23 +0100719 var lines =<< trim END
720 vim9script
721 export def Func()
722 g:result = 42
723 enddef
724 END
Bram Moolenaar648dd882022-04-14 21:36:15 +0100725 writefile(lines, 'XrelautoloadExport.vim')
Bram Moolenaar89445512022-04-14 12:58:23 +0100726 lines =<< trim END
727 vim9script
Bram Moolenaar648dd882022-04-14 21:36:15 +0100728 import autoload './XrelautoloadExport.vim' as some
Bram Moolenaar89445512022-04-14 12:58:23 +0100729 nnoremap <F3> :call <SID>some.Func()<CR>
730 END
731 writefile(lines, 'Xmapscript.vim')
732
733 source Xmapscript.vim
Bram Moolenaar648dd882022-04-14 21:36:15 +0100734 assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
Bram Moolenaar89445512022-04-14 12:58:23 +0100735 feedkeys("\<F3>", "xt")
736 assert_equal(42, g:result)
737
738 unlet g:result
Bram Moolenaar648dd882022-04-14 21:36:15 +0100739 delete('XrelautoloadExport.vim')
Bram Moolenaar89445512022-04-14 12:58:23 +0100740 delete('Xmapscript.vim')
741 nunmap <F3>
Bram Moolenaard8448622022-01-07 21:39:52 +0000742enddef
743
Bram Moolenaar5cb53b72022-05-26 19:54:05 +0100744def Test_autoload_import_var()
745 # variable name starts with "autoload"
746 var lines =<< trim END
747 vim9script
748 var autoloaded = "Xtest.vim"
749 import autoloaded
750 END
751 v9.CheckScriptFailure(lines, 'E1053: Could not import "Xtest.vim')
752enddef
753
Bram Moolenaar648dd882022-04-14 21:36:15 +0100754def Test_use_autoload_import_in_mapping()
755 var lines =<< trim END
756 vim9script
757 export def Func()
758 g:result = 49
759 enddef
760 END
761 mkdir('Xdir/autoload', 'p')
762 writefile(lines, 'Xdir/autoload/XautoloadExport.vim')
763 var save_rtp = &rtp
764 exe 'set rtp^=' .. getcwd() .. '/Xdir'
765
766 lines =<< trim END
767 vim9script
768 import autoload 'XautoloadExport.vim' as some
769 nnoremap <F3> :call <SID>some.Func()<CR>
770 END
771 writefile(lines, 'Xmapscript.vim')
772
773 source Xmapscript.vim
774 assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
775 feedkeys("\<F3>", "xt")
776 assert_equal(49, g:result)
777
778 unlet g:result
779 delete('Xmapscript.vim')
780 nunmap <F3>
781 delete('Xdir', 'rf')
782 &rtp = save_rtp
783enddef
784
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000785def Test_use_import_in_command_completion()
Bram Moolenaar15d16352022-01-17 20:09:08 +0000786 var lines =<< trim END
787 vim9script
788 export def Complete(..._): list<string>
789 return ['abcd']
790 enddef
791 END
792 writefile(lines, 'Xscript.vim')
793
794 lines =<< trim END
795 vim9script
796 import './Xscript.vim'
797
798 command -nargs=1 -complete=customlist,Xscript.Complete Cmd echo 'ok'
799 feedkeys(":Cmd ab\<Tab>\<C-B>#\<CR>", 'xnt')
800 assert_equal('#Cmd abcd', @:)
801 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000802 v9.CheckScriptSuccess(lines)
Bram Moolenaar15d16352022-01-17 20:09:08 +0000803
804 delcommand Cmd
805 delete('Xscript.vim')
806enddef
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
815 writefile(lines, 'Xscript.vim')
816
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
829 delete('Xscript.vim')
830enddef
831
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000832def Test_use_autoload_import_in_insert_completion()
833 mkdir('Xdir/autoload', 'p')
834 var save_rtp = &rtp
835 exe 'set rtp^=' .. getcwd() .. '/Xdir'
836
837 var lines =<< trim END
838 vim9script
839 export def ThesaurusFunc(findbase: bool, _): any
840 if findbase
841 return 1
842 endif
843 return [
844 'check',
845 'experiment',
846 'test',
847 'verification'
848 ]
849 enddef
850 g:completion_loaded = 'yes'
851 END
852 writefile(lines, 'Xdir/autoload/completion.vim')
853
854 new
855 lines =<< trim END
856 vim9script
857 g:completion_loaded = 'no'
858 import autoload 'completion.vim'
859 set thesaurusfunc=completion.ThesaurusFunc
860 assert_equal('no', g:completion_loaded)
861 feedkeys("i\<C-X>\<C-T>\<C-N>\<Esc>", 'xt')
862 assert_equal('experiment', getline(1))
863 assert_equal('yes', g:completion_loaded)
864 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000865 v9.CheckScriptSuccess(lines)
Bram Moolenaarf0e7e632022-01-21 13:29:56 +0000866
867 set thesaurusfunc=
868 bwipe!
869 delete('Xdir', 'rf')
870 &rtp = save_rtp
871enddef
872
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000873def Test_use_autoload_import_partial_in_opfunc()
874 mkdir('Xdir/autoload', 'p')
875 var save_rtp = &rtp
876 exe 'set rtp^=' .. getcwd() .. '/Xdir'
877
878 var lines =<< trim END
879 vim9script
880 export def Opfunc(..._)
881 g:opfunc_called = 'yes'
882 enddef
883 END
884 writefile(lines, 'Xdir/autoload/opfunc.vim')
885
886 new
887 lines =<< trim END
888 vim9script
889 import autoload 'opfunc.vim'
890 nnoremap <expr> <F3> TheFunc()
891 def TheFunc(): string
892 &operatorfunc = function('opfunc.Opfunc', [0])
893 return 'g@'
894 enddef
895 feedkeys("\<F3>l", 'xt')
896 assert_equal('yes', g:opfunc_called)
897 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000898 v9.CheckScriptSuccess(lines)
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000899
900 set opfunc=
901 bwipe!
902 delete('Xdir', 'rf')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000903 nunmap <F3>
904 &rtp = save_rtp
905enddef
906
907def Test_set_opfunc_to_autoload_func_directly()
908 mkdir('Xdir/autoload', 'p')
909 var save_rtp = &rtp
910 exe 'set rtp^=' .. getcwd() .. '/Xdir'
911
912 var lines =<< trim END
913 vim9script
914 export def Opfunc(..._)
915 g:opfunc_called = 'yes'
916 enddef
917 END
918 writefile(lines, 'Xdir/autoload/opfunc.vim')
919
920 new
921 lines =<< trim END
922 vim9script
923 import autoload 'opfunc.vim'
924 nnoremap <expr> <F3> TheFunc()
925 def TheFunc(): string
926 &operatorfunc = opfunc.Opfunc
927 return 'g@'
928 enddef
929 feedkeys("\<F3>l", 'xt')
930 assert_equal('yes', g:opfunc_called)
931 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000932 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000933
934 set opfunc=
935 bwipe!
936 delete('Xdir', 'rf')
937 nunmap <F3>
Bram Moolenaar3e93a2b2022-01-24 21:28:01 +0000938 &rtp = save_rtp
939enddef
940
Bram Moolenaare70dd112022-01-21 16:31:11 +0000941def Test_use_autoload_import_in_fold_expression()
942 mkdir('Xdir/autoload', 'p')
943 var save_rtp = &rtp
944 exe 'set rtp^=' .. getcwd() .. '/Xdir'
945
946 var lines =<< trim END
947 vim9script
948 export def Expr(): string
949 return getline(v:lnum) =~ '^#' ? '>1' : '1'
950 enddef
Bram Moolenaar9530b582022-01-22 13:39:08 +0000951 export def Text(): string
952 return 'fold text'
953 enddef
Bram Moolenaare70dd112022-01-21 16:31:11 +0000954 g:fold_loaded = 'yes'
955 END
956 writefile(lines, 'Xdir/autoload/fold.vim')
957
958 lines =<< trim END
959 vim9script
960 import autoload 'fold.vim'
961 &foldexpr = 'fold.Expr()'
Bram Moolenaar9530b582022-01-22 13:39:08 +0000962 &foldtext = 'fold.Text()'
Bram Moolenaare70dd112022-01-21 16:31:11 +0000963 &foldmethod = 'expr'
964 &debug = 'throw'
965 END
966 new
967 setline(1, ['# one', 'text', '# two', 'text'])
968 g:fold_loaded = 'no'
Bram Moolenaar62aec932022-01-29 21:45:34 +0000969 v9.CheckScriptSuccess(lines)
Bram Moolenaare70dd112022-01-21 16:31:11 +0000970 assert_equal('no', g:fold_loaded)
971 redraw
972 assert_equal('yes', g:fold_loaded)
973
974 # Check that script context of 'foldexpr' is copied to another buffer.
975 edit! otherfile
976 redraw
977
Bram Moolenaar9530b582022-01-22 13:39:08 +0000978 set foldexpr= foldtext& foldmethod& debug=
Bram Moolenaare70dd112022-01-21 16:31:11 +0000979 bwipe!
980 delete('Xdir', 'rf')
981 &rtp = save_rtp
982enddef
983
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100984def Test_autoload_import_relative()
985 var lines =<< trim END
986 vim9script
987
988 g:loaded = 'yes'
989 export def RelFunc(): string
990 return 'relfunc'
991 enddef
992 def NotExported()
993 echo 'not'
994 enddef
995
996 export var someText = 'some text'
997 var notexp = 'bad'
998 END
999 writefile(lines, 'XimportRel.vim')
1000 writefile(lines, 'XimportRel2.vim')
1001 writefile(lines, 'XimportRel3.vim')
Bram Moolenaar10611952022-04-03 21:11:34 +01001002 writefile(lines, 'XimportRel4.vim')
1003 writefile(lines, 'XimportRel5.vim')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001004
1005 lines =<< trim END
1006 vim9script
1007 g:loaded = 'no'
1008 import autoload './XimportRel.vim'
1009 assert_equal('no', g:loaded)
1010
1011 def AFunc(): string
1012 var res = ''
1013 res ..= XimportRel.RelFunc()
1014 res ..= '/'
1015 res ..= XimportRel.someText
1016 XimportRel.someText = 'from AFunc'
1017 return res
1018 enddef
1019 # script not loaded when compiling
1020 defcompile
1021 assert_equal('no', g:loaded)
1022
1023 assert_equal('relfunc/some text', AFunc())
1024 assert_equal('yes', g:loaded)
1025 unlet g:loaded
1026
1027 assert_equal('from AFunc', XimportRel.someText)
1028 XimportRel.someText = 'from script'
1029 assert_equal('from script', XimportRel.someText)
1030 END
1031 v9.CheckScriptSuccess(lines)
1032
1033 lines =<< trim END
1034 vim9script
1035 import autoload './XimportRel.vim'
1036 echo XimportRel.NotExported()
1037 END
1038 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 3)
1039
1040 lines =<< trim END
1041 vim9script
1042 import autoload './XimportRel.vim'
1043 echo XimportRel.notexp
1044 END
1045 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1046
1047 lines =<< trim END
1048 vim9script
1049 import autoload './XimportRel.vim'
1050 XimportRel.notexp = 'bad'
1051 END
1052 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 3)
1053
1054 lines =<< trim END
1055 vim9script
1056 import autoload './XimportRel.vim'
1057 def Func()
1058 echo XimportRel.NotExported()
1059 enddef
1060 Func()
1061 END
1062 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExported', 1)
1063
1064 lines =<< trim END
1065 vim9script
1066 import autoload './XimportRel.vim'
1067 def Func()
1068 echo XimportRel.notexp
1069 enddef
1070 Func()
1071 END
1072 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1073
Bram Moolenaar10611952022-04-03 21:11:34 +01001074 # Same, script not imported before
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001075 lines =<< trim END
1076 vim9script
Bram Moolenaar10611952022-04-03 21:11:34 +01001077 import autoload './XimportRel4.vim'
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001078 def Func()
Bram Moolenaar10611952022-04-03 21:11:34 +01001079 echo XimportRel4.notexp
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001080 enddef
1081 Func()
1082 END
1083 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1084
Bram Moolenaar10611952022-04-03 21:11:34 +01001085 # does not fail if the script wasn't loaded yet and only compiling
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001086 g:loaded = 'no'
1087 lines =<< trim END
1088 vim9script
1089 import autoload './XimportRel2.vim'
1090 def Func()
1091 echo XimportRel2.notexp
1092 enddef
1093 defcompile
1094 END
1095 v9.CheckScriptSuccess(lines)
1096 assert_equal('no', g:loaded)
1097
Bram Moolenaar10611952022-04-03 21:11:34 +01001098 lines =<< trim END
1099 vim9script
1100 import autoload './XimportRel.vim'
1101 def Func()
1102 XimportRel.notexp = 'bad'
1103 enddef
1104 Func()
1105 END
1106 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1107
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001108 # fails with a not loaded import
1109 lines =<< trim END
1110 vim9script
1111 import autoload './XimportRel3.vim'
1112 def Func()
1113 XimportRel3.notexp = 'bad'
1114 enddef
1115 Func()
1116 END
1117 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notexp', 1)
1118 assert_equal('yes', g:loaded)
1119 unlet g:loaded
1120
Bram Moolenaar10611952022-04-03 21:11:34 +01001121 lines =<< trim END
1122 vim9script
1123 import autoload './XimportRel5.vim'
1124 def Func()
1125 XimportRel5.nosuchvar = 'bad'
1126 enddef
1127 Func()
1128 END
1129 v9.CheckScriptFailure(lines, 'E121: Undefined variable: nosuchvar', 1)
1130 unlet g:loaded
1131
1132 # nasty: delete script after compiling function
1133 writefile(['vim9script'], 'XimportRelDel.vim')
1134 lines =<< trim END
1135 vim9script
1136
1137 import autoload './XimportRelDel.vim'
1138 def DoIt()
1139 echo XimportRelDel.var
1140 enddef
1141 defcompile
1142 delete('XimportRelDel.vim')
1143 DoIt()
1144 END
Bram Moolenaar242c1522022-04-03 21:52:51 +01001145 v9.CheckScriptFailure(lines, 'E484:')
Bram Moolenaar10611952022-04-03 21:11:34 +01001146
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001147 delete('XimportRel.vim')
1148 delete('XimportRel2.vim')
1149 delete('XimportRel3.vim')
Bram Moolenaar10611952022-04-03 21:11:34 +01001150 delete('XimportRel4.vim')
1151 delete('XimportRel5.vim')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +01001152enddef
1153
Bram Moolenaarccbfd482022-03-31 16:18:23 +01001154def Test_autoload_import_relative_autoload_dir()
1155 mkdir('autoload', 'p')
1156 var lines =<< trim END
1157 vim9script
1158 export def Bar()
1159 g:called_bar = 'yes'
1160 enddef
1161 END
1162 writefile(lines, 'autoload/script.vim')
1163
1164 lines =<< trim END
1165 vim9script
1166 import autoload './autoload/script.vim'
1167 def Foo()
1168 script.Bar()
1169 enddef
1170 Foo()
1171 assert_equal('yes', g:called_bar)
1172 END
1173 v9.CheckScriptSuccess(lines)
1174
1175 unlet g:called_bar
1176 delete('autoload', 'rf')
1177enddef
1178
Bram Moolenaaraac12da2022-04-24 21:33:20 +01001179def Test_autoload_import_deleted()
1180 var lines =<< trim END
1181 vim9script
1182 export const FOO = 1
1183 END
1184 writefile(lines, 'Xa.vim')
1185
1186 lines =<< trim END
1187 vim9script
1188 import autoload './Xa.vim'
1189
1190 delete('Xa.vim')
1191 var x = Xa.FOO
1192 END
1193 v9.CheckScriptFailure(lines, 'E484:')
1194
1195 delete('Xdir', 'rf')
1196enddef
1197
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001198func Test_import_in_diffexpr()
1199 CheckExecutable diff
1200
1201 call Run_Test_import_in_diffexpr()
1202endfunc
1203
1204def Run_Test_import_in_diffexpr()
1205 var lines =<< trim END
1206 vim9script
1207
1208 export def DiffExpr()
1209 # Prepend some text to check diff type detection
1210 writefile(['warning', ' message'], v:fname_out)
1211 silent exe '!diff ' .. v:fname_in .. ' '
1212 .. v:fname_new .. '>>' .. v:fname_out
1213 enddef
1214 END
1215 writefile(lines, 'Xdiffexpr')
1216
1217 lines =<< trim END
1218 vim9script
1219 import './Xdiffexpr' as diff
1220
1221 set diffexpr=diff.DiffExpr()
1222 set diffopt=foldcolumn:0
1223 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001224 v9.CheckScriptSuccess(lines)
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001225
1226 enew!
1227 call setline(1, ['one', 'two', 'three'])
1228 diffthis
1229
1230 botright vert new
1231 call setline(1, ['one', 'two', 'three.'])
1232 diffthis
1233 # we only check if this does not cause errors
1234 redraw
1235
1236 diffoff!
Bram Moolenaar50761872022-06-26 18:01:00 +01001237 set diffexpr=
1238 set diffopt&
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001239 bwipe!
1240 bwipe!
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00001241 delete('Xdiffexpr')
Bram Moolenaar7b29f6a2022-01-22 17:58:13 +00001242enddef
1243
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001244def Test_import_in_patchexpr()
1245 var lines =<< trim END
1246 vim9script
1247 export def TPatch()
1248 call writefile(['output file'], v:fname_out)
1249 enddef
1250 END
1251 writefile(lines, 'Xpatchexpr')
1252
1253 lines =<< trim END
1254 vim9script
1255 import './Xpatchexpr' as patch
1256 set patchexpr=patch.TPatch()
1257 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001258 v9.CheckScriptSuccess(lines)
Bram Moolenaar36c2add2022-01-22 20:55:30 +00001259
1260 call writefile(['input file'], 'Xinput')
1261 call writefile(['diff file'], 'Xdiff')
1262 :%bwipe!
1263 edit Xinput
1264 diffpatch Xdiff
1265 call assert_equal('output file', getline(1))
1266
1267 call delete('Xinput')
1268 call delete('Xdiff')
1269 call delete('Xpatchexpr')
1270 set patchexpr&
1271 :%bwipe!
1272enddef
1273
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001274def Test_import_in_formatexpr()
1275 var lines =<< trim END
1276 vim9script
1277 export def MyFormatExpr(): number
1278 g:did_format = 'yes'
1279 return 0
1280 enddef
1281 END
1282 writefile(lines, 'Xformatter')
1283
1284 lines =<< trim END
1285 vim9script
1286 import './Xformatter' as format
1287 set formatexpr=format.MyFormatExpr()
1288 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001289 v9.CheckScriptSuccess(lines)
Bram Moolenaar3ba685e2022-01-22 19:17:31 +00001290
1291 new
1292 setline(1, ['a', 'b', 'c'])
1293 normal gqG
1294 assert_equal('yes', g:did_format)
1295
1296 bwipe!
1297 delete('Xformatter')
1298 unlet g:did_format
1299 set formatexpr=
1300enddef
1301
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001302def Test_import_in_includeexpr()
1303 writefile(['found it'], 'Xthisfile')
1304 new
1305
1306 var lines =<< trim END
1307 vim9script
1308 export def DoSub(): string
1309 return substitute(v:fname, 'that', 'this', '')
1310 enddef
1311 END
1312 writefile(lines, 'Xinclude.vim')
1313
1314 lines =<< trim END
1315 vim9script
1316 import './Xinclude.vim'
1317 set includeexpr=Xinclude.DoSub()
1318 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001319 v9.CheckScriptSuccess(lines)
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001320
1321 setline(1, ['Xthatfile'])
1322 exe "normal \<C-W>f"
1323 assert_equal('Xthisfile', expand('%'))
1324
1325 bwipe!
1326 bwipe!
1327 set includeexpr=
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00001328 delete('Xinclude.vim')
Bram Moolenaar47bcc5f2022-01-22 20:19:22 +00001329 delete('Xthisfile')
1330enddef
1331
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001332def Test_import_in_indentexpr()
1333 var lines =<< trim END
1334 vim9script
1335 export def GetIndent(): number
1336 return 5
1337 enddef
1338 END
1339 writefile(lines, 'Xindenter')
1340
1341 lines =<< trim END
1342 vim9script
1343 import './Xindenter' as indent
1344 set indentexpr=indent.GetIndent()
1345 set debug=throw
1346 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001347 v9.CheckScriptSuccess(lines)
Bram Moolenaar28e60cc2022-01-22 20:32:00 +00001348
1349 new
1350 setline(1, 'hello')
1351 normal ==
1352 assert_equal(' hello', getline(1))
1353
1354 bwipe!
1355 set indentexpr= debug=
1356 delete('Xindenter')
1357enddef
1358
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001359func Test_import_in_printexpr()
1360 CheckFeature postscript
1361 call Run_Test_import_in_printexpr()
1362endfunc
1363
1364def Run_Test_import_in_printexpr()
1365 var lines =<< trim END
1366 vim9script
1367 export def PrintFile(): bool
1368 g:printed = 'yes'
1369 delete('v:fname_in')
1370 return false
1371 enddef
1372 END
1373 writefile(lines, 'Xprint.vim')
1374
1375 lines =<< trim END
1376 vim9script
1377 import './Xprint.vim'
1378 set printexpr=Xprint.PrintFile()
1379 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001380 v9.CheckScriptSuccess(lines)
Bram Moolenaar7ef4a2f2022-01-23 13:44:35 +00001381
1382 help
1383 hardcopy dummy args
1384 assert_equal('yes', g:printed)
1385
1386 delete('Xprint.vim')
1387 set printexpr=
1388enddef
1389
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001390def Test_import_in_charconvert()
1391 var lines =<< trim END
1392 vim9script
1393 export def MakeUpper(): bool
1394 var data = readfile(v:fname_in)
1395 map(data, 'toupper(v:val)')
1396 writefile(data, v:fname_out)
1397 return false # success
1398 enddef
1399 END
1400 writefile(lines, 'Xconvert.vim')
1401
1402 lines =<< trim END
1403 vim9script
1404 import './Xconvert.vim' as conv
1405 set charconvert=conv.MakeUpper()
1406 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001407 v9.CheckScriptSuccess(lines)
Bram Moolenaarf4e88f22022-01-23 14:17:28 +00001408
1409 writefile(['one', 'two'], 'Xfile')
1410 new Xfile
1411 write ++enc=ucase Xfile1
1412 assert_equal(['ONE', 'TWO'], readfile('Xfile1'))
1413
1414 delete('Xfile')
1415 delete('Xfile1')
1416 delete('Xconvert.vim')
1417 bwipe!
1418 set charconvert&
1419enddef
1420
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001421func Test_import_in_spellsuggest_expr()
1422 CheckFeature spell
1423 call Run_Test_import_in_spellsuggest_expr()
1424endfunc
1425
1426def Run_Test_import_in_spellsuggest_expr()
1427 var lines =<< trim END
1428 vim9script
1429 export def MySuggest(): list<any>
1430 return [['Fox', 8], ['Fop', 9]]
1431 enddef
1432 END
1433 writefile(lines, 'Xsuggest.vim')
1434
1435 lines =<< trim END
1436 vim9script
1437 import './Xsuggest.vim' as sugg
1438 set spell spellsuggest=expr:sugg.MySuggest()
1439 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001440 v9.CheckScriptSuccess(lines)
Bram Moolenaar2a7aa832022-01-23 17:59:06 +00001441
1442 set verbose=1 # report errors
1443 call assert_equal(['Fox', 'Fop'], spellsuggest('Fo', 2))
1444
1445 delete('Xsuggest.vim')
1446 set nospell spellsuggest& verbose=0
1447enddef
1448
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001449def Test_export_shadows_global_function()
1450 mkdir('Xdir/autoload', 'p')
1451 var save_rtp = &rtp
1452 exe 'set rtp^=' .. getcwd() .. '/Xdir'
1453
1454 var lines =<< trim END
1455 vim9script
1456 export def Shadow(): string
1457 return 'Shadow()'
1458 enddef
1459 END
1460 writefile(lines, 'Xdir/autoload/shadow.vim')
1461
1462 lines =<< trim END
1463 vim9script
1464
1465 def g:Shadow(): string
1466 return 'global'
1467 enddef
1468
1469 import autoload 'shadow.vim'
1470 assert_equal('Shadow()', shadow.Shadow())
1471 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001472 v9.CheckScriptSuccess(lines)
Bram Moolenaaracc4b562022-01-24 13:54:45 +00001473
1474 delfunc g:Shadow
1475 bwipe!
1476 delete('Xdir', 'rf')
1477 &rtp = save_rtp
1478enddef
1479
Bram Moolenaard8448622022-01-07 21:39:52 +00001480def Test_export_fails()
Bram Moolenaar62aec932022-01-29 21:45:34 +00001481 v9.CheckScriptFailure(['export var some = 123'], 'E1042:')
1482 v9.CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
1483 v9.CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01001484 v9.CheckScriptFailure(['vim9script', 'export function /a1b2c3'], 'E1044:')
Bram Moolenaard8448622022-01-07 21:39:52 +00001485
1486 assert_fails('export something', 'E1043:')
1487enddef
1488
1489func Test_import_fails_without_script()
1490 CheckRunVimInTerminal
1491
1492 " call indirectly to avoid compilation error for missing functions
1493 call Run_Test_import_fails_on_command_line()
1494endfunc
1495
1496def Run_Test_import_fails_on_command_line()
1497 var export =<< trim END
1498 vim9script
1499 export def Foo(): number
1500 return 0
1501 enddef
1502 END
1503 writefile(export, 'XexportCmd.vim')
1504
Bram Moolenaar62aec932022-01-29 21:45:34 +00001505 var buf = g:RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', {
Bram Moolenaard8448622022-01-07 21:39:52 +00001506 rows: 6, wait_for_ruler: 0})
Bram Moolenaar62aec932022-01-29 21:45:34 +00001507 g:WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5)))
Bram Moolenaard8448622022-01-07 21:39:52 +00001508
1509 delete('XexportCmd.vim')
Bram Moolenaar62aec932022-01-29 21:45:34 +00001510 g:StopVimInTerminal(buf)
Bram Moolenaard8448622022-01-07 21:39:52 +00001511enddef
1512
1513def Test_vim9_reload_noclear()
1514 var lines =<< trim END
1515 vim9script
1516 export var exported = 'thexport'
1517
1518 export def TheFunc(x = 0)
1519 enddef
1520 END
1521 writefile(lines, 'XExportReload')
1522 lines =<< trim END
1523 vim9script noclear
1524 g:loadCount += 1
Bram Moolenaara749a422022-02-12 19:52:25 +00001525 var reloaded = 'init'
Bram Moolenaard8448622022-01-07 21:39:52 +00001526 import './XExportReload' as exp
1527
1528 def Again(): string
1529 return 'again'
1530 enddef
1531
1532 exp.TheFunc()
1533
Bram Moolenaara749a422022-02-12 19:52:25 +00001534 if exists('loaded') | finish | endif
1535 var loaded = true
Bram Moolenaard8448622022-01-07 21:39:52 +00001536
Bram Moolenaara749a422022-02-12 19:52:25 +00001537 var notReloaded = 'yes'
1538 reloaded = 'first'
Bram Moolenaard8448622022-01-07 21:39:52 +00001539 def g:Values(): list<string>
Bram Moolenaara749a422022-02-12 19:52:25 +00001540 return [reloaded, notReloaded, Again(), Once(), exp.exported]
Bram Moolenaard8448622022-01-07 21:39:52 +00001541 enddef
1542
1543 def Once(): string
1544 return 'once'
1545 enddef
1546 END
1547 writefile(lines, 'XReloaded')
1548 g:loadCount = 0
1549 source XReloaded
1550 assert_equal(1, g:loadCount)
1551 assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values())
1552 source XReloaded
1553 assert_equal(2, g:loadCount)
1554 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1555 source XReloaded
1556 assert_equal(3, g:loadCount)
1557 assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values())
1558
1559 delete('XReloaded')
1560 delete('XExportReload')
1561 delfunc g:Values
1562 unlet g:loadCount
1563
1564 lines =<< trim END
1565 vim9script
1566 def Inner()
1567 enddef
1568 END
1569 lines->writefile('XreloadScript.vim')
1570 source XreloadScript.vim
1571
1572 lines =<< trim END
1573 vim9script
1574 def Outer()
1575 def Inner()
1576 enddef
1577 enddef
1578 defcompile
1579 END
1580 lines->writefile('XreloadScript.vim')
1581 source XreloadScript.vim
1582
1583 delete('XreloadScript.vim')
1584enddef
1585
Bram Moolenaarcd1cda22022-02-16 21:48:25 +00001586def Test_vim_reload_noclear_arg_count()
1587 var lines =<< trim END
1588 vim9script noclear
1589
1590 if !exists('g:didload')
1591 def Test(a: string, b: string)
1592 echo a b
1593 enddef
1594 def Call()
1595 Test('a', 'b')
1596 enddef
1597 else
1598 # redefine with one argument less
1599 def Test(a: string)
1600 echo a
1601 enddef
1602 endif
1603 Call()
1604 g:didload = 1
1605 END
1606 lines->writefile('XreloadScript_1.vim')
1607 source XreloadScript_1.vim
1608 assert_fails('source XreloadScript_1.vim', 'E1106: One argument too many')
1609 unlet g:didload
1610
1611 lines =<< trim END
1612 vim9script noclear
1613
1614 if !exists('g:didload')
1615 def Test(a: string, b: string, c: string)
1616 echo a b
1617 enddef
1618 def Call()
1619 Test('a', 'b', 'c')
1620 enddef
1621 else
1622 # redefine with one argument less
1623 def Test(a: string)
1624 echo a
1625 enddef
1626 endif
1627 Call()
1628 g:didload = 1
1629 END
1630 lines->writefile('XreloadScript_2.vim')
1631 source XreloadScript_2.vim
1632 assert_fails('source XreloadScript_2.vim', 'E1106: 2 arguments too many')
1633 unlet g:didload
1634
1635 lines =<< trim END
1636 vim9script noclear
1637
1638 if !exists('g:didload')
1639 def Test(a: string)
1640 echo a
1641 enddef
1642 def Call()
1643 Test('a')
1644 enddef
1645 else
1646 # redefine with one argument extra
1647 def Test(a: string, b: string)
1648 echo a b
1649 enddef
1650 endif
1651 Call()
1652 g:didload = 1
1653 END
1654 lines->writefile('XreloadScript_3.vim')
1655 source XreloadScript_3.vim
1656 assert_fails('source XreloadScript_3.vim', 'E1190: One argument too few')
1657 unlet g:didload
1658
1659 lines =<< trim END
1660 vim9script noclear
1661
1662 if !exists('g:didload')
1663 def Test(a: string)
1664 echo a
1665 enddef
1666 def Call()
1667 Test('a')
1668 enddef
1669 else
1670 # redefine with two arguments extra
1671 def Test(a: string, b: string, c: string)
1672 echo a b
1673 enddef
1674 endif
1675 Call()
1676 g:didload = 1
1677 END
1678 lines->writefile('XreloadScript_4.vim')
1679 source XreloadScript_4.vim
1680 assert_fails('source XreloadScript_4.vim', 'E1190: 2 arguments too few')
1681 unlet g:didload
1682
1683 delete('XreloadScript_1.vim')
1684 delete('XreloadScript_2.vim')
1685 delete('XreloadScript_3.vim')
1686 delete('XreloadScript_4.vim')
1687enddef
1688
1689def Test_vim9_reload_noclear_error()
1690 var lines =<< trim END
1691 vim9script noclear
1692
1693 if !exists('g:didload')
1694 def Test(a: string)
1695 echo a
1696 enddef
1697 def Call()
1698 Test('a')
1699 enddef
1700 else
1701 # redefine with a compile error
1702 def Test(a: string)
1703 echo ax
1704 enddef
1705 endif
1706 Call()
1707 g:didload = 1
1708 END
1709 lines->writefile('XreloadScriptErr.vim')
1710 source XreloadScriptErr.vim
1711 assert_fails('source XreloadScriptErr.vim', 'E1001: Variable not found: ax')
1712
1713 unlet g:didload
1714 delete('XreloadScriptErr.vim')
1715enddef
1716
Bram Moolenaard8448622022-01-07 21:39:52 +00001717def Test_vim9_reload_import()
1718 var lines =<< trim END
1719 vim9script
1720 const var = ''
1721 var valone = 1234
1722 def MyFunc(arg: string)
1723 valone = 5678
1724 enddef
1725 END
1726 var morelines =<< trim END
1727 var valtwo = 222
1728 export def GetValtwo(): number
1729 return valtwo
1730 enddef
1731 END
1732 writefile(lines + morelines, 'Xreload.vim')
1733 source Xreload.vim
1734 source Xreload.vim
1735 source Xreload.vim
1736
1737 # cannot declare a var twice
1738 lines =<< trim END
1739 vim9script
1740 var valone = 1234
1741 var valone = 5678
1742 END
1743 writefile(lines, 'Xreload.vim')
1744 assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim')
1745
1746 delete('Xreload.vim')
1747 delete('Ximport.vim')
1748enddef
1749
1750" if a script is reloaded with a script-local variable that changed its type, a
1751" compiled function using that variable must fail.
1752def Test_script_reload_change_type()
1753 var lines =<< trim END
1754 vim9script noclear
1755 var str = 'string'
1756 def g:GetStr(): string
1757 return str .. 'xxx'
1758 enddef
1759 END
1760 writefile(lines, 'Xreload.vim')
1761 source Xreload.vim
1762 echo g:GetStr()
1763
1764 lines =<< trim END
1765 vim9script noclear
1766 var str = 1234
1767 END
1768 writefile(lines, 'Xreload.vim')
1769 source Xreload.vim
1770 assert_fails('echo g:GetStr()', 'E1150:')
1771
1772 delfunc g:GetStr
1773 delete('Xreload.vim')
1774enddef
1775
1776" Define CallFunc so that the test can be compiled
1777command CallFunc echo 'nop'
1778
1779def Test_script_reload_from_function()
1780 var lines =<< trim END
1781 vim9script
1782
Bram Moolenaar10611952022-04-03 21:11:34 +01001783 if exists('g:loadedThis')
Bram Moolenaard8448622022-01-07 21:39:52 +00001784 finish
1785 endif
Bram Moolenaar10611952022-04-03 21:11:34 +01001786 g:loadedThis = 1
Bram Moolenaard8448622022-01-07 21:39:52 +00001787 delcommand CallFunc
1788 command CallFunc Func()
1789 def Func()
1790 so XreloadFunc.vim
1791 g:didTheFunc = 1
1792 enddef
1793 END
1794 writefile(lines, 'XreloadFunc.vim')
1795 source XreloadFunc.vim
1796 CallFunc
1797 assert_equal(1, g:didTheFunc)
1798
1799 delete('XreloadFunc.vim')
1800 delcommand CallFunc
Bram Moolenaar10611952022-04-03 21:11:34 +01001801 unlet g:loadedThis
Bram Moolenaard8448622022-01-07 21:39:52 +00001802 unlet g:didTheFunc
1803enddef
1804
1805def s:RetSome(): string
1806 return 'some'
1807enddef
1808
1809" Not exported function that is referenced needs to be accessed by the
1810" script-local name.
1811def Test_vim9_funcref()
1812 var sortlines =<< trim END
1813 vim9script
1814 def Compare(i1: number, i2: number): number
1815 return i2 - i1
1816 enddef
1817
1818 export def FastSort(): list<number>
1819 return range(5)->sort(Compare)
1820 enddef
1821
1822 export def GetString(arg: string): string
1823 return arg
1824 enddef
1825 END
1826 writefile(sortlines, 'Xsort.vim')
1827
1828 var lines =<< trim END
1829 vim9script
1830 import './Xsort.vim'
1831 def Test()
1832 g:result = Xsort.FastSort()
1833 enddef
1834 Test()
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001835 END
1836 writefile(lines, 'Xscript.vim')
1837 source Xscript.vim
1838 assert_equal([4, 3, 2, 1, 0], g:result)
1839 unlet g:result
Bram Moolenaard8448622022-01-07 21:39:52 +00001840
Bram Moolenaar7c24dfd2022-01-08 17:03:55 +00001841 lines =<< trim END
1842 vim9script
Bram Moolenaard8448622022-01-07 21:39:52 +00001843 # using a function imported with "as"
1844 import './Xsort.vim' as anAlias
1845 assert_equal('yes', anAlias.GetString('yes'))
1846
1847 # using the function from a compiled function
1848 def TestMore(): string
1849 var s = s:anAlias.GetString('foo')
1850 return s .. anAlias.GetString('bar')
1851 enddef
1852 assert_equal('foobar', TestMore())
1853
1854 # error when using a function that isn't exported
1855 assert_fails('anAlias.Compare(1, 2)', 'E1049:')
1856 END
1857 writefile(lines, 'Xscript.vim')
1858
Bram Moolenaard8448622022-01-07 21:39:52 +00001859 delete('Xsort.vim')
1860 delete('Xscript.vim')
1861
1862 var Funcref = function('s:RetSome')
1863 assert_equal('some', Funcref())
1864enddef
1865
1866" Check that when searching for "FilterFunc" it finds the import in the
1867" script where FastFilter() is called from, both as a string and as a direct
1868" function reference.
1869def Test_vim9_funcref_other_script()
1870 var filterLines =<< trim END
1871 vim9script
1872 export def FilterFunc(idx: number, val: number): bool
1873 return idx % 2 == 1
1874 enddef
1875 export def FastFilter(): list<number>
1876 return range(10)->filter('FilterFunc(v:key, v:val)')
1877 enddef
1878 export def FastFilterDirect(): list<number>
1879 return range(10)->filter(FilterFunc)
1880 enddef
1881 END
1882 writefile(filterLines, 'Xfilter.vim')
1883
1884 var lines =<< trim END
1885 vim9script
1886 import './Xfilter.vim' as filter
1887 def Test()
1888 var x: list<number> = filter.FastFilter()
1889 enddef
1890 Test()
1891 def TestDirect()
1892 var x: list<number> = filter.FastFilterDirect()
1893 enddef
1894 TestDirect()
1895 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00001896 v9.CheckScriptSuccess(lines)
Bram Moolenaard8448622022-01-07 21:39:52 +00001897 delete('Xfilter.vim')
1898enddef
1899
1900def Test_import_absolute()
1901 var import_lines = [
1902 'vim9script',
1903 'import "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim" as abs',
1904 'def UseExported()',
1905 ' g:imported_abs = abs.exported',
1906 ' abs.exported = 8888',
1907 ' g:imported_after = abs.exported',
1908 'enddef',
1909 'UseExported()',
1910 'g:import_disassembled = execute("disass UseExported")',
1911 ]
1912 writefile(import_lines, 'Ximport_abs.vim')
1913 writefile(s:export_script_lines, 'Xexport_abs.vim')
1914
1915 source Ximport_abs.vim
1916
1917 assert_equal(9876, g:imported_abs)
1918 assert_equal(8888, g:imported_after)
1919 assert_match('<SNR>\d\+_UseExported\_s*' ..
1920 'g:imported_abs = abs.exported\_s*' ..
1921 '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1922 '1 STOREG g:imported_abs\_s*' ..
1923 'abs.exported = 8888\_s*' ..
1924 '2 PUSHNR 8888\_s*' ..
1925 '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' ..
1926 'g:imported_after = abs.exported\_s*' ..
1927 '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' ..
1928 '5 STOREG g:imported_after',
1929 g:import_disassembled)
1930
1931 Undo_export_script_lines()
1932 unlet g:imported_abs
1933 unlet g:import_disassembled
1934
1935 delete('Ximport_abs.vim')
1936 delete('Xexport_abs.vim')
1937enddef
1938
1939def Test_import_rtp()
1940 var import_lines = [
1941 'vim9script',
1942 'import "Xexport_rtp.vim" as rtp',
1943 'g:imported_rtp = rtp.exported',
1944 ]
1945 writefile(import_lines, 'Ximport_rtp.vim')
1946 mkdir('import', 'p')
1947 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
1948
1949 var save_rtp = &rtp
1950 &rtp = getcwd()
1951 source Ximport_rtp.vim
1952 &rtp = save_rtp
1953
1954 assert_equal(9876, g:imported_rtp)
1955
1956 Undo_export_script_lines()
1957 unlet g:imported_rtp
1958 delete('Ximport_rtp.vim')
1959 delete('import', 'rf')
1960enddef
1961
1962def Test_import_compile_error()
1963 var export_lines = [
1964 'vim9script',
1965 'export def ExpFunc(): string',
1966 ' return notDefined',
1967 'enddef',
1968 ]
1969 writefile(export_lines, 'Xexported.vim')
1970
1971 var import_lines = [
1972 'vim9script',
1973 'import "./Xexported.vim" as expo',
1974 'def ImpFunc()',
1975 ' echo expo.ExpFunc()',
1976 'enddef',
1977 'defcompile',
1978 ]
1979 writefile(import_lines, 'Ximport.vim')
1980
1981 try
1982 source Ximport.vim
1983 catch /E1001/
1984 # Error should be before the Xexported.vim file.
1985 assert_match('E1001: Variable not found: notDefined', v:exception)
1986 assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint)
1987 endtry
1988
1989 delete('Xexported.vim')
1990 delete('Ximport.vim')
1991enddef
1992
1993def Test_func_overrules_import_fails()
1994 var export_lines =<< trim END
1995 vim9script
1996 export def Func()
1997 echo 'imported'
1998 enddef
1999 END
2000 writefile(export_lines, 'XexportedFunc.vim')
2001
2002 var lines =<< trim END
2003 vim9script
2004 import './XexportedFunc.vim' as Func
2005 def Func()
2006 echo 'local to function'
2007 enddef
2008 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002009 v9.CheckScriptFailure(lines, 'E1213: Redefining imported item "Func"')
Bram Moolenaard8448622022-01-07 21:39:52 +00002010
2011 lines =<< trim END
2012 vim9script
2013 import './XexportedFunc.vim' as Func
2014 def Outer()
2015 def Func()
2016 echo 'local to function'
2017 enddef
2018 enddef
2019 defcompile
2020 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002021 v9.CheckScriptFailure(lines, 'E1236:')
Bram Moolenaard8448622022-01-07 21:39:52 +00002022
2023 delete('XexportedFunc.vim')
2024enddef
2025
2026def Test_source_vim9_from_legacy()
2027 var vim9_lines =<< trim END
2028 vim9script
2029 var local = 'local'
2030 g:global = 'global'
2031 export var exported = 'exported'
2032 export def GetText(): string
2033 return 'text'
2034 enddef
2035 END
2036 writefile(vim9_lines, 'Xvim9_script.vim')
2037
2038 var legacy_lines =<< trim END
2039 source Xvim9_script.vim
2040
2041 call assert_false(exists('local'))
2042 call assert_false(exists('exported'))
2043 call assert_false(exists('s:exported'))
2044 call assert_equal('global', global)
2045 call assert_equal('global', g:global)
Bram Moolenaard8448622022-01-07 21:39:52 +00002046 END
2047 writefile(legacy_lines, 'Xlegacy_script.vim')
2048
2049 source Xlegacy_script.vim
2050 assert_equal('global', g:global)
2051 unlet g:global
2052
2053 delete('Xlegacy_script.vim')
2054 delete('Xvim9_script.vim')
2055enddef
2056
Bram Moolenaarc43e6232022-01-13 20:51:56 +00002057def Test_import_vim9_from_legacy()
2058 var vim9_lines =<< trim END
2059 vim9script
2060 var local = 'local'
2061 g:global = 'global'
2062 export var exported = 'exported'
2063 export def GetText(): string
2064 return 'text'
2065 enddef
2066 END
2067 writefile(vim9_lines, 'Xvim9_export.vim')
2068
2069 var legacy_lines =<< trim END
2070 import './Xvim9_export.vim' as vim9
2071
2072 call assert_false(exists('vim9'))
2073 call assert_false(exists('local'))
2074 call assert_false(exists('s:vim9.local'))
2075 call assert_equal('global', global)
2076 call assert_equal('global', g:global)
2077 call assert_false(exists('exported'))
2078 call assert_false(exists('s:exported'))
2079 call assert_false(exists('*GetText'))
2080
2081 " imported symbol is script-local
2082 call assert_equal('exported', s:vim9.exported)
2083 call assert_equal('text', s:vim9.GetText())
2084 END
2085 writefile(legacy_lines, 'Xlegacy_script.vim')
2086
2087 source Xlegacy_script.vim
2088 assert_equal('global', g:global)
2089 unlet g:global
2090
2091 delete('Xlegacy_script.vim')
2092 delete('Xvim9_export.vim')
2093enddef
2094
Bram Moolenaard8448622022-01-07 21:39:52 +00002095def Test_cmdline_win()
2096 # if the Vim syntax highlighting uses Vim9 constructs they can be used from
2097 # the command line window.
2098 mkdir('rtp/syntax', 'p')
2099 var export_lines =<< trim END
2100 vim9script
2101 export var That = 'yes'
2102 END
2103 writefile(export_lines, 'rtp/syntax/Xexport.vim')
2104 var import_lines =<< trim END
2105 vim9script
2106 import './Xexport.vim' as exp
2107 echo exp.That
2108 END
2109 writefile(import_lines, 'rtp/syntax/vim.vim')
2110 var save_rtp = &rtp
2111 &rtp = getcwd() .. '/rtp' .. ',' .. &rtp
2112 syntax on
2113 augroup CmdWin
2114 autocmd CmdwinEnter * g:got_there = 'yes'
2115 augroup END
2116 # this will open and also close the cmdline window
2117 feedkeys('q:', 'xt')
2118 assert_equal('yes', g:got_there)
2119
2120 augroup CmdWin
2121 au!
2122 augroup END
2123 &rtp = save_rtp
2124 delete('rtp', 'rf')
2125enddef
2126
2127def Test_import_gone_when_sourced_twice()
2128 var exportlines =<< trim END
2129 vim9script
2130 if exists('g:guard')
2131 finish
2132 endif
2133 g:guard = 1
2134 export var name = 'someName'
2135 END
2136 writefile(exportlines, 'XexportScript.vim')
2137
2138 var lines =<< trim END
2139 vim9script
2140 import './XexportScript.vim' as expo
2141 def g:GetName(): string
2142 return expo.name
2143 enddef
2144 END
2145 writefile(lines, 'XscriptImport.vim')
2146 so XscriptImport.vim
2147 assert_equal('someName', g:GetName())
2148
2149 so XexportScript.vim
2150 assert_fails('call g:GetName()', 'E1149:')
2151
2152 delfunc g:GetName
2153 delete('XexportScript.vim')
2154 delete('XscriptImport.vim')
2155 unlet g:guard
2156enddef
2157
Bram Moolenaar160aa862022-01-10 21:29:57 +00002158" test using an auto-loaded function and variable
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002159def Test_vim9_autoload_full_name()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002160 var lines =<< trim END
2161 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002162 export def Gettest(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002163 return 'test'
2164 enddef
2165 g:some#name = 'name'
2166 g:some#dict = {key: 'value'}
2167
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002168 export def Varargs(a1: string, ...l: list<string>): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002169 return a1 .. l[0] .. l[1]
2170 enddef
2171 END
2172
2173 mkdir('Xdir/autoload', 'p')
2174 writefile(lines, 'Xdir/autoload/some.vim')
2175 var save_rtp = &rtp
2176 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2177
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002178 assert_equal('test', g:some#Gettest())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002179 assert_equal('name', g:some#name)
2180 assert_equal('value', g:some#dict.key)
2181 g:some#other = 'other'
2182 assert_equal('other', g:some#other)
2183
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002184 assert_equal('abc', some#Varargs('a', 'b', 'c'))
Bram Moolenaar160aa862022-01-10 21:29:57 +00002185
2186 # upper case script name works
2187 lines =<< trim END
2188 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002189 export def GetOther(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002190 return 'other'
2191 enddef
2192 END
2193 writefile(lines, 'Xdir/autoload/Other.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002194 assert_equal('other', g:Other#GetOther())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002195
2196 delete('Xdir', 'rf')
2197 &rtp = save_rtp
2198enddef
2199
2200def Test_vim9script_autoload()
2201 mkdir('Xdir/autoload', 'p')
2202 var save_rtp = &rtp
2203 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2204
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002205 # when the path has "/autoload/" prefix is not needed
Bram Moolenaar160aa862022-01-10 21:29:57 +00002206 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002207 vim9script
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002208 g:prefixed_loaded += 1
Bram Moolenaar160aa862022-01-10 21:29:57 +00002209
2210 export def Gettest(): string
2211 return 'test'
2212 enddef
2213
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002214 export var name = 'name'
2215
2216 export func GetFunc()
2217 return Gettest() .. 'more' .. s:name
Bram Moolenaar160aa862022-01-10 21:29:57 +00002218 endfunc
2219
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002220 export def GetDef(): string
2221 return Gettest() .. 'more' .. name
2222 enddef
2223
Bram Moolenaar160aa862022-01-10 21:29:57 +00002224 export final fname = 'final'
2225 export const cname = 'const'
2226 END
2227 writefile(lines, 'Xdir/autoload/prefixed.vim')
2228
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002229 g:prefixed_loaded = 0
2230 g:expected_loaded = 0
Bram Moolenaar160aa862022-01-10 21:29:57 +00002231 lines =<< trim END
2232 vim9script
2233 import autoload 'prefixed.vim'
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002234 assert_equal(g:expected_loaded, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002235 assert_equal('test', prefixed.Gettest())
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002236 assert_equal(1, g:prefixed_loaded)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002237
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002238 assert_equal('testmorename', prefixed.GetFunc())
2239 assert_equal('testmorename', prefixed.GetDef())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002240 assert_equal('name', prefixed.name)
2241 assert_equal('final', prefixed.fname)
2242 assert_equal('const', prefixed.cname)
2243 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002244 v9.CheckScriptSuccess(lines)
Bram Moolenaar17d36cb2022-01-12 11:46:40 +00002245 # can source it again, autoload script not loaded again
2246 g:expected_loaded = 1
Bram Moolenaar62aec932022-01-29 21:45:34 +00002247 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002248
2249 # can also get the items by autoload name
2250 lines =<< trim END
2251 call assert_equal('test', prefixed#Gettest())
Bram Moolenaar0e3e7ba2022-01-13 20:18:56 +00002252 call assert_equal('testmorename', prefixed#GetFunc())
Bram Moolenaar160aa862022-01-10 21:29:57 +00002253 call assert_equal('name', prefixed#name)
2254 call assert_equal('final', prefixed#fname)
2255 call assert_equal('const', prefixed#cname)
2256 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002257 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002258
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002259 unlet g:prefixed_loaded
2260 unlet g:expected_loaded
2261 delete('Xdir', 'rf')
2262 &rtp = save_rtp
2263enddef
2264
Bram Moolenaard02dce22022-01-18 17:43:04 +00002265def Test_import_autoload_not_exported()
2266 mkdir('Xdir/autoload', 'p')
2267 var save_rtp = &rtp
2268 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2269
2270 # error when using an item that is not exported from an autoload script
2271 var exportLines =<< trim END
2272 vim9script
2273 var notExported = 123
2274 def NotExport()
2275 echo 'nop'
2276 enddef
2277 END
2278 writefile(exportLines, 'Xdir/autoload/notExport1.vim')
2279
2280 var lines =<< trim END
2281 vim9script
2282 import autoload 'notExport1.vim'
2283 echo notExport1.notFound
2284 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002285 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002286
2287 lines =<< trim END
2288 vim9script
2289 import autoload 'notExport1.vim'
2290 echo notExport1.notExported
2291 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002292 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002293
2294 lines =<< trim END
2295 vim9script
2296 import autoload 'notExport1.vim'
2297 echo notExport1.NotFunc()
2298 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002299 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002300
2301 lines =<< trim END
2302 vim9script
2303 import autoload 'notExport1.vim'
2304 echo notExport1.NotExport()
2305 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002306 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002307
2308 lines =<< trim END
2309 vim9script
2310 import autoload 'notExport1.vim'
2311 echo 'text'->notExport1.NotFunc()
2312 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002313 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002314
2315 lines =<< trim END
2316 vim9script
2317 import autoload 'notExport1.vim'
2318 echo 'text'->notExport1.NotExport()
2319 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002320 v9.CheckScriptFailure(lines, 'E1049: Item not exported in script: NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002321
2322 # using a :def function we use a different autoload script every time so that
2323 # the function is compiled without the script loaded
2324 writefile(exportLines, 'Xdir/autoload/notExport2.vim')
2325 lines =<< trim END
2326 vim9script
2327 import autoload 'notExport2.vim'
2328 def Testit()
2329 echo notExport2.notFound
2330 enddef
2331 Testit()
2332 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002333 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport2#notFound')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002334
2335 writefile(exportLines, 'Xdir/autoload/notExport3.vim')
2336 lines =<< trim END
2337 vim9script
2338 import autoload 'notExport3.vim'
2339 def Testit()
2340 echo notExport3.notExported
2341 enddef
2342 Testit()
2343 END
2344 # don't get E1049 because it is too complicated to figure out
Bram Moolenaar62aec932022-01-29 21:45:34 +00002345 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: notExport3#notExported')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002346
2347 writefile(exportLines, 'Xdir/autoload/notExport4.vim')
2348 lines =<< trim END
2349 vim9script
2350 import autoload 'notExport4.vim'
2351 def Testit()
2352 echo notExport4.NotFunc()
2353 enddef
2354 Testit()
2355 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002356 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport4#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002357
2358 writefile(exportLines, 'Xdir/autoload/notExport5.vim')
2359 lines =<< trim END
2360 vim9script
2361 import autoload 'notExport5.vim'
2362 def Testit()
2363 echo notExport5.NotExport()
2364 enddef
2365 Testit()
2366 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002367 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport5#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002368
2369 writefile(exportLines, 'Xdir/autoload/notExport6.vim')
2370 lines =<< trim END
2371 vim9script
2372 import autoload 'notExport6.vim'
2373 def Testit()
2374 echo 'text'->notExport6.NotFunc()
2375 enddef
2376 Testit()
2377 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002378 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport6#NotFunc')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002379
2380 writefile(exportLines, 'Xdir/autoload/notExport7.vim')
2381 lines =<< trim END
2382 vim9script
2383 import autoload 'notExport7.vim'
2384 def Testit()
2385 echo 'text'->notExport7.NotExport()
2386 enddef
2387 Testit()
2388 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002389 v9.CheckScriptFailure(lines, 'E117: Unknown function: notExport7#NotExport')
Bram Moolenaard02dce22022-01-18 17:43:04 +00002390
2391 delete('Xdir', 'rf')
2392 &rtp = save_rtp
2393enddef
2394
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002395def Test_vim9script_autoload_call()
2396 mkdir('Xdir/autoload', 'p')
2397 var save_rtp = &rtp
2398 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2399
2400 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002401 vim9script
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002402
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002403 export def RetArg(arg: string): string
2404 return arg
2405 enddef
2406
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002407 export def Getother()
2408 g:result = 'other'
2409 enddef
2410 END
Bram Moolenaar5d982692022-01-12 15:15:27 +00002411 writefile(lines, 'Xdir/autoload/another.vim')
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002412
2413 lines =<< trim END
2414 vim9script
Bram Moolenaar5d982692022-01-12 15:15:27 +00002415 import autoload 'another.vim'
Bram Moolenaarcbbc48f2022-01-18 12:58:28 +00002416
2417 # compile this before 'another.vim' is loaded
2418 def CallAnother()
2419 assert_equal('foo', 'foo'->another.RetArg())
2420 enddef
2421 CallAnother()
2422
Bram Moolenaar5d982692022-01-12 15:15:27 +00002423 call another.Getother()
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002424 assert_equal('other', g:result)
Bram Moolenaar3d8e25a2022-01-22 11:00:02 +00002425
2426 assert_equal('arg', call('another.RetArg', ['arg']))
Bram Moolenaar8164f6e2022-02-06 13:08:41 +00002427
2428 verbose function another.Getother
2429 # should we disallow this?
2430 verbose function another#Getother
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002431 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002432 v9.CheckScriptSuccess(lines)
Bram Moolenaarf111cdf2022-01-12 12:48:17 +00002433
2434 unlet g:result
Bram Moolenaar160aa862022-01-10 21:29:57 +00002435 delete('Xdir', 'rf')
2436 &rtp = save_rtp
2437enddef
2438
Bram Moolenaarb697dc22022-01-22 11:27:29 +00002439def Test_vim9script_noclear_autoload()
2440 mkdir('Xdir/autoload', 'p')
2441 var save_rtp = &rtp
2442 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2443
2444 var lines =<< trim END
2445 vim9script
2446 export def Func(): string
2447 return 'called'
2448 enddef
2449 g:double_loaded = 'yes'
2450 END
2451 writefile(lines, 'Xdir/autoload/double.vim')
2452
2453 lines =<< trim END
2454 vim9script noclear
2455 if exists('g:script_loaded')
2456 finish
2457 endif
2458 g:script_loaded = true
2459
2460 import autoload 'double.vim'
2461 nnoremap <F3> <ScriptCmd>g:result = double.Func()<CR>
2462 END
2463 g:double_loaded = 'no'
2464 writefile(lines, 'Xloaddouble')
2465 source Xloaddouble
2466 assert_equal('no', g:double_loaded)
2467 assert_equal(true, g:script_loaded)
2468 source Xloaddouble
2469 feedkeys("\<F3>", 'xt')
2470 assert_equal('called', g:result)
2471 assert_equal('yes', g:double_loaded)
2472
2473 delete('Xloaddouble')
2474 unlet g:double_loaded
2475 unlet g:script_loaded
2476 unlet g:result
2477 delete('Xdir', 'rf')
2478 &rtp = save_rtp
2479enddef
2480
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002481def Test_vim9script_autoload_duplicate()
2482 mkdir('Xdir/autoload', 'p')
2483
2484 var lines =<< trim END
2485 vim9script
2486
2487 export def Func()
2488 enddef
2489
2490 def Func()
2491 enddef
2492 END
2493 writefile(lines, 'Xdir/autoload/dupfunc.vim')
2494 assert_fails('source Xdir/autoload/dupfunc.vim', 'E1073:')
2495
2496 lines =<< trim END
2497 vim9script
2498
2499 def Func()
2500 enddef
2501
2502 export def Func()
2503 enddef
2504 END
2505 writefile(lines, 'Xdir/autoload/dup2func.vim')
2506 assert_fails('source Xdir/autoload/dup2func.vim', 'E1073:')
2507
2508 lines =<< trim END
2509 vim9script
2510
2511 def Func()
2512 enddef
2513
2514 export var Func = 'asdf'
2515 END
2516 writefile(lines, 'Xdir/autoload/dup3func.vim')
Bram Moolenaare18acb02022-03-21 20:40:35 +00002517 assert_fails('source Xdir/autoload/dup3func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002518
2519 lines =<< trim END
2520 vim9script
2521
2522 export var Func = 'asdf'
2523
2524 def Func()
2525 enddef
2526 END
2527 writefile(lines, 'Xdir/autoload/dup4func.vim')
2528 assert_fails('source Xdir/autoload/dup4func.vim', 'E707:')
2529
2530 lines =<< trim END
2531 vim9script
2532
2533 var Func = 'asdf'
2534
2535 export def Func()
2536 enddef
2537 END
2538 writefile(lines, 'Xdir/autoload/dup5func.vim')
2539 assert_fails('source Xdir/autoload/dup5func.vim', 'E707:')
2540
2541 lines =<< trim END
2542 vim9script
2543
2544 export def Func()
2545 enddef
2546
2547 var Func = 'asdf'
2548 END
2549 writefile(lines, 'Xdir/autoload/dup6func.vim')
Bram Moolenaare18acb02022-03-21 20:40:35 +00002550 assert_fails('source Xdir/autoload/dup6func.vim', 'E1041: Redefining script item: "Func"')
Bram Moolenaar9c7cae62022-01-20 19:10:25 +00002551
2552 delete('Xdir', 'rf')
2553enddef
2554
Bram Moolenaar2017d6f2022-01-20 19:38:46 +00002555def Test_autoload_missing_function_name()
2556 mkdir('Xdir/autoload', 'p')
2557
2558 var lines =<< trim END
2559 vim9script
2560
2561 def loadme#()
2562 enddef
2563 END
2564 writefile(lines, 'Xdir/autoload/loadme.vim')
2565 assert_fails('source Xdir/autoload/loadme.vim', 'E129:')
2566
2567 delete('Xdir', 'rf')
2568enddef
2569
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002570def Test_autoload_name_wrong()
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002571 var lines =<< trim END
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002572 def Xscriptname#Func()
2573 enddef
2574 END
2575 writefile(lines, 'Xscriptname.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002576 v9.CheckScriptFailure(lines, 'E746:')
Yegappan Lakshmanan7e765a32022-01-24 11:40:37 +00002577 delete('Xscriptname.vim')
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002578
2579 mkdir('Xdir/autoload', 'p')
2580 lines =<< trim END
2581 vim9script
2582 def somescript#Func()
2583 enddef
2584 END
2585 writefile(lines, 'Xdir/autoload/somescript.vim')
2586 assert_fails('source Xdir/autoload/somescript.vim', 'E1263:')
2587
2588 delete('Xdir', 'rf')
Bram Moolenaar19e69a62022-01-21 20:37:05 +00002589enddef
2590
Bram Moolenaard041f422022-01-12 19:54:00 +00002591def Test_import_autoload_postponed()
2592 mkdir('Xdir/autoload', 'p')
2593 var save_rtp = &rtp
2594 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2595
2596 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002597 vim9script
Bram Moolenaard041f422022-01-12 19:54:00 +00002598
2599 g:loaded_postponed = 'true'
2600 export var variable = 'bla'
2601 export def Function(): string
2602 return 'bla'
2603 enddef
2604 END
2605 writefile(lines, 'Xdir/autoload/postponed.vim')
2606
2607 lines =<< trim END
2608 vim9script
2609
2610 import autoload 'postponed.vim'
2611 def Tryit()
2612 echo postponed.variable
2613 echo postponed.Function()
2614 enddef
2615 defcompile
2616 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002617 v9.CheckScriptSuccess(lines)
Bram Moolenaard041f422022-01-12 19:54:00 +00002618 assert_false(exists('g:loaded_postponed'))
Bram Moolenaar62aec932022-01-29 21:45:34 +00002619 v9.CheckScriptSuccess(lines + ['Tryit()'])
Bram Moolenaard041f422022-01-12 19:54:00 +00002620 assert_equal('true', g:loaded_postponed)
2621
2622 unlet g:loaded_postponed
2623 delete('Xdir', 'rf')
2624 &rtp = save_rtp
2625enddef
2626
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002627def Test_import_autoload_override()
2628 mkdir('Xdir/autoload', 'p')
2629 var save_rtp = &rtp
2630 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2631 test_override('autoload', 1)
2632
2633 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002634 vim9script
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002635
2636 g:loaded_override = 'true'
2637 export var variable = 'bla'
2638 export def Function(): string
2639 return 'bla'
2640 enddef
2641 END
2642 writefile(lines, 'Xdir/autoload/override.vim')
2643
2644 lines =<< trim END
2645 vim9script
2646
2647 import autoload 'override.vim'
2648 assert_equal('true', g:loaded_override)
2649
2650 def Tryit()
2651 echo override.doesNotExist
2652 enddef
2653 defcompile
2654 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002655 v9.CheckScriptFailure(lines, 'E1048: Item not found in script: doesNotExist', 1)
Bram Moolenaar3e4fa3d2022-01-13 22:05:09 +00002656
2657 test_override('autoload', 0)
2658 unlet g:loaded_override
2659 delete('Xdir', 'rf')
2660 &rtp = save_rtp
2661enddef
2662
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002663def Test_autoload_mapping()
2664 mkdir('Xdir/autoload', 'p')
2665 var save_rtp = &rtp
2666 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2667
2668 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002669 vim9script
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002670
2671 g:toggle_loaded = 'yes'
2672
2673 export def Toggle(): string
2674 return ":g:toggle_called = 'yes'\<CR>"
2675 enddef
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002676 export def Doit()
2677 g:doit_called = 'yes'
2678 enddef
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002679 END
2680 writefile(lines, 'Xdir/autoload/toggle.vim')
2681
2682 lines =<< trim END
2683 vim9script
2684
2685 import autoload 'toggle.vim'
2686
2687 nnoremap <silent> <expr> tt toggle.Toggle()
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002688 nnoremap <silent> xx <ScriptCmd>toggle.Doit()<CR>
2689 nnoremap <silent> yy <Cmd>toggle.Doit()<CR>
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002690 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002691 v9.CheckScriptSuccess(lines)
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002692 assert_false(exists("g:toggle_loaded"))
2693 assert_false(exists("g:toggle_called"))
Bram Moolenaar6079da72022-01-18 14:16:59 +00002694 assert_match('\d A: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002695
2696 feedkeys("tt", 'xt')
2697 assert_equal('yes', g:toggle_loaded)
2698 assert_equal('yes', g:toggle_called)
Bram Moolenaar6079da72022-01-18 14:16:59 +00002699 assert_match('\d: \f*[/\\]toggle.vim', execute('scriptnames'))
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002700
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002701 feedkeys("xx", 'xt')
2702 assert_equal('yes', g:doit_called)
2703
2704 assert_fails('call feedkeys("yy", "xt")', 'E121: Undefined variable: toggle')
2705
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002706 nunmap tt
Bram Moolenaare32c3c42022-01-15 18:26:04 +00002707 nunmap xx
2708 nunmap yy
Bram Moolenaar19db9e62022-01-11 11:58:19 +00002709 unlet g:toggle_loaded
2710 unlet g:toggle_called
2711 delete('Xdir', 'rf')
2712 &rtp = save_rtp
2713enddef
2714
Bram Moolenaar160aa862022-01-10 21:29:57 +00002715def Test_vim9script_autoload_fails()
2716 var lines =<< trim END
2717 vim9script autoload
2718 var n = 0
2719 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002720 v9.CheckScriptFailure(lines, 'E475: Invalid argument: autoload')
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002721
2722 lines =<< trim END
2723 vim9script noclear noclear
2724 var n = 0
2725 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002726 v9.CheckScriptFailure(lines, 'E983: Duplicate argument: noclear')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +01002727
2728 lines =<< trim END
2729 vim9script noclears
2730 var n = 0
2731 END
2732 v9.CheckScriptFailure(lines, 'E475: Invalid argument: noclears')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002733enddef
2734
2735def Test_import_autoload_fails()
2736 var lines =<< trim END
2737 vim9script
2738 import autoload autoload 'prefixed.vim'
2739 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002740 v9.CheckScriptFailure(lines, 'E121: Undefined variable: autoload')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002741
2742 lines =<< trim END
2743 vim9script
Bram Moolenaar1836d612022-01-18 13:14:47 +00002744 import autoload './doesNotExist.vim'
Bram Moolenaar160aa862022-01-10 21:29:57 +00002745 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002746 v9.CheckScriptFailure(lines, 'E282:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002747
2748 lines =<< trim END
2749 vim9script
2750 import autoload '/dir/doesNotExist.vim'
2751 END
Bram Moolenaar4dea2d92022-03-31 11:37:57 +01002752 v9.CheckScriptFailure(lines, 'E282:', 2)
2753
2754 lines =<< trim END
2755 vim9script
2756 import autoload '../testdir'
2757 END
2758 v9.CheckScriptFailure(lines, 'E17:', 2)
Bram Moolenaar1836d612022-01-18 13:14:47 +00002759
2760 lines =<< trim END
2761 vim9script
2762 import autoload 'doesNotExist.vim'
2763 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002764 v9.CheckScriptFailure(lines, 'E1053: Could not import "doesNotExist.vim"')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002765enddef
2766
2767" test disassembling an auto-loaded function starting with "debug"
2768def Test_vim9_autoload_disass()
2769 mkdir('Xdir/autoload', 'p')
2770 var save_rtp = &rtp
2771 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2772
2773 var lines =<< trim END
2774 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002775 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002776 return 'debug'
2777 enddef
2778 END
2779 writefile(lines, 'Xdir/autoload/debugit.vim')
2780
2781 lines =<< trim END
2782 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002783 export def Test(): string
Bram Moolenaar160aa862022-01-10 21:29:57 +00002784 return 'profile'
2785 enddef
2786 END
2787 writefile(lines, 'Xdir/autoload/profileit.vim')
2788
2789 lines =<< trim END
2790 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002791 assert_equal('debug', debugit#Test())
2792 disass debugit#Test
2793 assert_equal('profile', profileit#Test())
2794 disass profileit#Test
Bram Moolenaar160aa862022-01-10 21:29:57 +00002795 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002796 v9.CheckScriptSuccess(lines)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002797
2798 delete('Xdir', 'rf')
2799 &rtp = save_rtp
2800enddef
2801
2802" test using a vim9script that is auto-loaded from an autocmd
2803def Test_vim9_aucmd_autoload()
2804 var lines =<< trim END
2805 vim9script
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002806 export def Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002807 echomsg getreg('"')
2808 enddef
2809 END
2810
2811 mkdir('Xdir/autoload', 'p')
2812 writefile(lines, 'Xdir/autoload/foo.vim')
2813 var save_rtp = &rtp
2814 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2815 augroup test
Bram Moolenaard8fe6d32022-01-30 18:40:44 +00002816 autocmd TextYankPost * call foo#Test()
Bram Moolenaar160aa862022-01-10 21:29:57 +00002817 augroup END
2818
2819 normal Y
2820
2821 augroup test
2822 autocmd!
2823 augroup END
2824 delete('Xdir', 'rf')
2825 &rtp = save_rtp
2826enddef
2827
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002828" test using a autoloaded file that is case sensitive
2829def Test_vim9_autoload_case_sensitive()
2830 var lines =<< trim END
Bram Moolenaarfd218c82022-01-18 16:26:24 +00002831 vim9script
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002832 export def CaseSensitive(): string
2833 return 'done'
2834 enddef
2835 END
2836
2837 mkdir('Xdir/autoload', 'p')
2838 writefile(lines, 'Xdir/autoload/CaseSensitive.vim')
2839 var save_rtp = &rtp
2840 exe 'set rtp^=' .. getcwd() .. '/Xdir'
2841
2842 lines =<< trim END
2843 vim9script
2844 import autoload 'CaseSensitive.vim'
2845 assert_equal('done', CaseSensitive.CaseSensitive())
2846 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002847 v9.CheckScriptSuccess(lines)
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002848
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002849 if !has('fname_case')
2850 lines =<< trim END
2851 vim9script
2852 import autoload 'CaseSensitive.vim'
2853 import autoload 'casesensitive.vim'
2854 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002855 v9.CheckScriptFailure(lines, 'E1262:')
Bram Moolenaarbfac4092022-01-16 11:12:12 +00002856 endif
2857
Bram Moolenaar3049fcf2022-01-13 19:25:50 +00002858 delete('Xdir', 'rf')
2859 &rtp = save_rtp
2860enddef
2861
Bram Moolenaar160aa862022-01-10 21:29:57 +00002862" This was causing a crash because suppress_errthrow wasn't reset.
2863def Test_vim9_autoload_error()
2864 var lines =<< trim END
2865 vim9script
2866 def crash#func()
2867 try
2868 for x in List()
2869 endfor
2870 catch
2871 endtry
2872 g:ok = true
2873 enddef
2874 fu List()
2875 invalid
2876 endfu
2877 try
2878 alsoinvalid
2879 catch /wontmatch/
2880 endtry
2881 END
2882 call mkdir('Xruntime/autoload', 'p')
2883 call writefile(lines, 'Xruntime/autoload/crash.vim')
2884
2885 # run in a separate Vim to avoid the side effects of assert_fails()
2886 lines =<< trim END
2887 exe 'set rtp^=' .. getcwd() .. '/Xruntime'
2888 call crash#func()
2889 call writefile(['ok'], 'Xdidit')
2890 qall!
2891 END
2892 writefile(lines, 'Xscript')
Bram Moolenaar62aec932022-01-29 21:45:34 +00002893 g:RunVim([], [], '-S Xscript')
Bram Moolenaar160aa862022-01-10 21:29:57 +00002894 assert_equal(['ok'], readfile('Xdidit'))
2895
2896 delete('Xdidit')
2897 delete('Xscript')
2898 delete('Xruntime', 'rf')
2899
2900 lines =<< trim END
2901 vim9script
2902 var foo#bar = 'asdf'
2903 END
Bram Moolenaar62aec932022-01-29 21:45:34 +00002904 v9.CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2)
Bram Moolenaar160aa862022-01-10 21:29:57 +00002905enddef
2906
Bram Moolenaard8448622022-01-07 21:39:52 +00002907
2908" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker