1" Test using builtin functions in the Vim9 script language. 2 3source check.vim 4source vim9.vim 5 6" Test for passing too many or too few arguments to builtin functions 7func Test_internalfunc_arg_error() 8 let l =<< trim END 9 def! FArgErr(): float 10 return ceil(1.1, 2) 11 enddef 12 defcompile 13 END 14 call writefile(l, 'Xinvalidarg') 15 call assert_fails('so Xinvalidarg', 'E118:', '', 1, 'FArgErr') 16 let l =<< trim END 17 def! FArgErr(): float 18 return ceil() 19 enddef 20 defcompile 21 END 22 call writefile(l, 'Xinvalidarg') 23 call assert_fails('so Xinvalidarg', 'E119:', '', 1, 'FArgErr') 24 call delete('Xinvalidarg') 25endfunc 26 27" Test for builtin functions returning different types 28func Test_InternalFuncRetType() 29 let lines =<< trim END 30 def RetFloat(): float 31 return ceil(1.456) 32 enddef 33 34 def RetListAny(): list<any> 35 return items({k: 'v'}) 36 enddef 37 38 def RetListString(): list<string> 39 return split('a:b:c', ':') 40 enddef 41 42 def RetListDictAny(): list<dict<any>> 43 return getbufinfo() 44 enddef 45 46 def RetDictNumber(): dict<number> 47 return wordcount() 48 enddef 49 50 def RetDictString(): dict<string> 51 return environ() 52 enddef 53 END 54 call writefile(lines, 'Xscript') 55 source Xscript 56 57 call RetFloat()->assert_equal(2.0) 58 call RetListAny()->assert_equal([['k', 'v']]) 59 call RetListString()->assert_equal(['a', 'b', 'c']) 60 call RetListDictAny()->assert_notequal([]) 61 call RetDictNumber()->assert_notequal({}) 62 call RetDictString()->assert_notequal({}) 63 call delete('Xscript') 64endfunc 65 66def Test_abs() 67 assert_equal(0, abs(0)) 68 assert_equal(2, abs(-2)) 69 assert_equal(3, abs(3)) 70 CheckDefFailure(['abs("text")'], 'E1013: Argument 1: type mismatch, expected number but got string', 1) 71 if has('float') 72 assert_equal(0, abs(0)) 73 assert_equal(2.0, abs(-2.0)) 74 assert_equal(3.0, abs(3.0)) 75 endif 76enddef 77 78def Test_add_list() 79 var l: list<number> # defaults to empty list 80 add(l, 9) 81 assert_equal([9], l) 82 83 var lines =<< trim END 84 var l: list<number> 85 add(l, "x") 86 END 87 CheckDefFailure(lines, 'E1012:', 2) 88 89 lines =<< trim END 90 add(test_null_list(), 123) 91 END 92 CheckDefExecAndScriptFailure(lines, 'E1130:', 1) 93 94 lines =<< trim END 95 var l: list<number> = test_null_list() 96 add(l, 123) 97 END 98 CheckDefExecFailure(lines, 'E1130:', 2) 99 100 # Getting variable with NULL list allocates a new list at script level 101 lines =<< trim END 102 vim9script 103 var l: list<number> = test_null_list() 104 add(l, 123) 105 END 106 CheckScriptSuccess(lines) 107enddef 108 109def Test_add_blob() 110 var b1: blob = 0z12 111 add(b1, 0x34) 112 assert_equal(0z1234, b1) 113 114 var b2: blob # defaults to empty blob 115 add(b2, 0x67) 116 assert_equal(0z67, b2) 117 118 var lines =<< trim END 119 var b: blob 120 add(b, "x") 121 END 122 CheckDefFailure(lines, 'E1012:', 2) 123 124 lines =<< trim END 125 add(test_null_blob(), 123) 126 END 127 CheckDefExecAndScriptFailure(lines, 'E1131:', 1) 128 129 lines =<< trim END 130 var b: blob = test_null_blob() 131 add(b, 123) 132 END 133 CheckDefExecFailure(lines, 'E1131:', 2) 134 135 # Getting variable with NULL blob allocates a new blob at script level 136 lines =<< trim END 137 vim9script 138 var b: blob = test_null_blob() 139 add(b, 123) 140 END 141 CheckScriptSuccess(lines) 142enddef 143 144def Test_append() 145 new 146 setline(1, range(3)) 147 var res1: number = append(1, 'one') 148 assert_equal(0, res1) 149 var res2: bool = append(3, 'two') 150 assert_equal(false, res2) 151 assert_equal(['0', 'one', '1', 'two', '2'], getline(1, 6)) 152 153 append(0, 'zero') 154 assert_equal('zero', getline(1)) 155 bwipe! 156enddef 157 158def Test_balloon_show() 159 CheckGui 160 CheckFeature balloon_eval 161 162 assert_fails('balloon_show(true)', 'E1174:') 163enddef 164 165def Test_balloon_split() 166 CheckFeature balloon_eval_term 167 168 assert_fails('balloon_split(true)', 'E1174:') 169enddef 170 171def Test_browse() 172 CheckFeature browse 173 174 var lines =<< trim END 175 browse(1, 2, 3, 4) 176 END 177 CheckDefExecAndScriptFailure(lines, 'E1174: String required for argument 2') 178 lines =<< trim END 179 browse(1, 'title', 3, 4) 180 END 181 CheckDefExecAndScriptFailure(lines, 'E1174: String required for argument 3') 182 lines =<< trim END 183 browse(1, 'title', 'dir', 4) 184 END 185 CheckDefExecAndScriptFailure(lines, 'E1174: String required for argument 4') 186enddef 187 188def Test_bufexists() 189 assert_fails('bufexists(true)', 'E1174') 190enddef 191 192def Test_buflisted() 193 var res: bool = buflisted('asdf') 194 assert_equal(false, res) 195 assert_fails('buflisted(true)', 'E1174') 196enddef 197 198def Test_bufname() 199 split SomeFile 200 bufname('%')->assert_equal('SomeFile') 201 edit OtherFile 202 bufname('#')->assert_equal('SomeFile') 203 close 204enddef 205 206def Test_bufnr() 207 var buf = bufnr() 208 bufnr('%')->assert_equal(buf) 209 210 buf = bufnr('Xdummy', true) 211 buf->assert_notequal(-1) 212 exe 'bwipe! ' .. buf 213enddef 214 215def Test_bufwinid() 216 var origwin = win_getid() 217 below split SomeFile 218 var SomeFileID = win_getid() 219 below split OtherFile 220 below split SomeFile 221 bufwinid('SomeFile')->assert_equal(SomeFileID) 222 223 win_gotoid(origwin) 224 only 225 bwipe SomeFile 226 bwipe OtherFile 227 228 assert_fails('bufwinid(true)', 'E1138') 229enddef 230 231def Test_call_call() 232 var l = [3, 2, 1] 233 call('reverse', [l]) 234 l->assert_equal([1, 2, 3]) 235enddef 236 237def Test_ch_logfile() 238 if !has('channel') 239 CheckFeature channel 240 endif 241 assert_fails('ch_logfile(true)', 'E1174') 242 assert_fails('ch_logfile("foo", true)', 'E1174') 243enddef 244 245def Test_char2nr() 246 char2nr('あ', true)->assert_equal(12354) 247 248 assert_fails('char2nr(true)', 'E1174') 249enddef 250 251def Test_charclass() 252 assert_fails('charclass(true)', 'E1174') 253enddef 254 255def Test_chdir() 256 assert_fails('chdir(true)', 'E1174') 257enddef 258 259def Test_col() 260 new 261 setline(1, 'asdf') 262 col([1, '$'])->assert_equal(5) 263 264 assert_fails('col(true)', 'E1174') 265enddef 266 267def Test_confirm() 268 if !has('dialog_con') && !has('dialog_gui') 269 CheckFeature dialog_con 270 endif 271 272 assert_fails('confirm(true)', 'E1174') 273 assert_fails('confirm("yes", true)', 'E1174') 274 assert_fails('confirm("yes", "maybe", 2, true)', 'E1174') 275enddef 276 277def Test_copy_return_type() 278 var l = copy([1, 2, 3]) 279 var res = 0 280 for n in l 281 res += n 282 endfor 283 res->assert_equal(6) 284 285 var dl = deepcopy([1, 2, 3]) 286 res = 0 287 for n in dl 288 res += n 289 endfor 290 res->assert_equal(6) 291 292 dl = deepcopy([1, 2, 3], true) 293enddef 294 295def Test_count() 296 count('ABC ABC ABC', 'b', true)->assert_equal(3) 297 count('ABC ABC ABC', 'b', false)->assert_equal(0) 298enddef 299 300def Test_cursor() 301 new 302 setline(1, range(4)) 303 cursor(2, 1) 304 assert_equal(2, getcurpos()[1]) 305 cursor('$', 1) 306 assert_equal(4, getcurpos()[1]) 307 308 var lines =<< trim END 309 cursor('2', 1) 310 END 311 CheckDefExecAndScriptFailure(lines, 'E475:') 312enddef 313 314def Test_delete() 315 var res: bool = delete('doesnotexist') 316 assert_equal(true, res) 317enddef 318 319def Test_executable() 320 assert_false(executable("")) 321 assert_false(executable(test_null_string())) 322 323 CheckDefExecFailure(['echo executable(123)'], 'E1174:') 324 CheckDefExecFailure(['echo executable(true)'], 'E1174:') 325enddef 326 327def Test_exepath() 328 CheckDefExecFailure(['echo exepath(true)'], 'E1174:') 329 CheckDefExecFailure(['echo exepath(v:null)'], 'E1174:') 330 CheckDefExecFailure(['echo exepath("")'], 'E1175:') 331enddef 332 333def Test_expand() 334 split SomeFile 335 expand('%', true, true)->assert_equal(['SomeFile']) 336 close 337enddef 338 339def Test_extend_arg_types() 340 g:number_one = 1 341 g:string_keep = 'keep' 342 var lines =<< trim END 343 assert_equal([1, 2, 3], extend([1, 2], [3])) 344 assert_equal([3, 1, 2], extend([1, 2], [3], 0)) 345 assert_equal([1, 3, 2], extend([1, 2], [3], 1)) 346 assert_equal([1, 3, 2], extend([1, 2], [3], g:number_one)) 347 348 assert_equal({a: 1, b: 2, c: 3}, extend({a: 1, b: 2}, {c: 3})) 349 assert_equal({a: 1, b: 4}, extend({a: 1, b: 2}, {b: 4})) 350 assert_equal({a: 1, b: 2}, extend({a: 1, b: 2}, {b: 4}, 'keep')) 351 assert_equal({a: 1, b: 2}, extend({a: 1, b: 2}, {b: 4}, g:string_keep)) 352 353 var res: list<dict<any>> 354 extend(res, mapnew([1, 2], (_, v) => ({}))) 355 assert_equal([{}, {}], res) 356 END 357 CheckDefAndScriptSuccess(lines) 358 359 CheckDefFailure(['extend([1, 2], 3)'], 'E1013: Argument 2: type mismatch, expected list<number> but got number') 360 CheckDefFailure(['extend([1, 2], ["x"])'], 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>') 361 CheckDefFailure(['extend([1, 2], [3], "x")'], 'E1013: Argument 3: type mismatch, expected number but got string') 362 363 CheckDefFailure(['extend({a: 1}, 42)'], 'E1013: Argument 2: type mismatch, expected dict<number> but got number') 364 CheckDefFailure(['extend({a: 1}, {b: "x"})'], 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>') 365 CheckDefFailure(['extend({a: 1}, {b: 2}, 1)'], 'E1013: Argument 3: type mismatch, expected string but got number') 366 367 CheckDefFailure(['extend([1], ["b"])'], 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>') 368 CheckDefExecFailure(['extend([1], ["b", 1])'], 'E1013: Argument 2: type mismatch, expected list<number> but got list<any>') 369enddef 370 371def Test_extendnew() 372 assert_equal([1, 2, 'a'], extendnew([1, 2], ['a'])) 373 assert_equal({one: 1, two: 'a'}, extendnew({one: 1}, {two: 'a'})) 374 375 CheckDefFailure(['extendnew({a: 1}, 42)'], 'E1013: Argument 2: type mismatch, expected dict<number> but got number') 376 CheckDefFailure(['extendnew({a: 1}, [42])'], 'E1013: Argument 2: type mismatch, expected dict<number> but got list<number>') 377 CheckDefFailure(['extendnew([1, 2], "x")'], 'E1013: Argument 2: type mismatch, expected list<number> but got string') 378 CheckDefFailure(['extendnew([1, 2], {x: 1})'], 'E1013: Argument 2: type mismatch, expected list<number> but got dict<number>') 379enddef 380 381def Test_extend_return_type() 382 var l = extend([1, 2], [3]) 383 var res = 0 384 for n in l 385 res += n 386 endfor 387 res->assert_equal(6) 388enddef 389 390func g:ExtendDict(d) 391 call extend(a:d, #{xx: 'x'}) 392endfunc 393 394def Test_extend_dict_item_type() 395 var lines =<< trim END 396 var d: dict<number> = {a: 1} 397 extend(d, {b: 2}) 398 END 399 CheckDefAndScriptSuccess(lines) 400 401 lines =<< trim END 402 var d: dict<number> = {a: 1} 403 extend(d, {b: 'x'}) 404 END 405 CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>', 2) 406 407 lines =<< trim END 408 var d: dict<number> = {a: 1} 409 g:ExtendDict(d) 410 END 411 CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string', 0) 412 CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1) 413enddef 414 415func g:ExtendList(l) 416 call extend(a:l, ['x']) 417endfunc 418 419def Test_extend_list_item_type() 420 var lines =<< trim END 421 var l: list<number> = [1] 422 extend(l, [2]) 423 END 424 CheckDefAndScriptSuccess(lines) 425 426 lines =<< trim END 427 var l: list<number> = [1] 428 extend(l, ['x']) 429 END 430 CheckDefAndScriptFailure(lines, 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>', 2) 431 432 lines =<< trim END 433 var l: list<number> = [1] 434 g:ExtendList(l) 435 END 436 CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string', 0) 437 CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1) 438enddef 439 440def Test_extend_with_error_function() 441 var lines =<< trim END 442 vim9script 443 def F() 444 { 445 var m = 10 446 } 447 echo m 448 enddef 449 450 def Test() 451 var d: dict<any> = {} 452 d->extend({A: 10, Func: function('F', [])}) 453 enddef 454 455 Test() 456 END 457 CheckScriptFailure(lines, 'E1001: Variable not found: m') 458enddef 459 460def Test_job_info_return_type() 461 if has('job') 462 job_start(&shell) 463 var jobs = job_info() 464 assert_equal('list<job>', typename(jobs)) 465 assert_equal('dict<any>', typename(job_info(jobs[0]))) 466 job_stop(jobs[0]) 467 endif 468enddef 469 470def Test_filereadable() 471 assert_false(filereadable("")) 472 assert_false(filereadable(test_null_string())) 473 474 CheckDefExecFailure(['echo filereadable(123)'], 'E1174:') 475 CheckDefExecFailure(['echo filereadable(true)'], 'E1174:') 476enddef 477 478def Test_filewritable() 479 assert_false(filewritable("")) 480 assert_false(filewritable(test_null_string())) 481 482 CheckDefExecFailure(['echo filewritable(123)'], 'E1174:') 483 CheckDefExecFailure(['echo filewritable(true)'], 'E1174:') 484enddef 485 486def Test_finddir() 487 CheckDefExecFailure(['echo finddir(true)'], 'E1174:') 488 CheckDefExecFailure(['echo finddir(v:null)'], 'E1174:') 489 CheckDefExecFailure(['echo finddir("")'], 'E1175:') 490enddef 491 492def Test_findfile() 493 CheckDefExecFailure(['echo findfile(true)'], 'E1174:') 494 CheckDefExecFailure(['echo findfile(v:null)'], 'E1174:') 495 CheckDefExecFailure(['echo findfile("")'], 'E1175:') 496enddef 497 498def Test_flattennew() 499 var lines =<< trim END 500 var l = [1, [2, [3, 4]], 5] 501 call assert_equal([1, 2, 3, 4, 5], flattennew(l)) 502 call assert_equal([1, [2, [3, 4]], 5], l) 503 504 call assert_equal([1, 2, [3, 4], 5], flattennew(l, 1)) 505 call assert_equal([1, [2, [3, 4]], 5], l) 506 END 507 CheckDefAndScriptSuccess(lines) 508 509 lines =<< trim END 510 echo flatten([1, 2, 3]) 511 END 512 CheckDefAndScriptFailure(lines, 'E1158:') 513enddef 514 515def Test_fnamemodify() 516 CheckDefSuccess(['echo fnamemodify(test_null_string(), ":p")']) 517 CheckDefSuccess(['echo fnamemodify("", ":p")']) 518 CheckDefSuccess(['echo fnamemodify("file", test_null_string())']) 519 CheckDefSuccess(['echo fnamemodify("file", "")']) 520 521 CheckDefExecFailure(['echo fnamemodify(true, ":p")'], 'E1174: String required for argument 1') 522 CheckDefExecFailure(['echo fnamemodify(v:null, ":p")'], 'E1174: String required for argument 1') 523 CheckDefExecFailure(['echo fnamemodify("file", true)'], 'E1174: String required for argument 2') 524enddef 525 526def Wrong_dict_key_type(items: list<number>): list<number> 527 return filter(items, (_, val) => get({[val]: 1}, 'x')) 528enddef 529 530def Test_filter_wrong_dict_key_type() 531 assert_fails('Wrong_dict_key_type([1, v:null, 3])', 'E1013:') 532enddef 533 534def Test_filter_return_type() 535 var l = filter([1, 2, 3], (_, _) => 1) 536 var res = 0 537 for n in l 538 res += n 539 endfor 540 res->assert_equal(6) 541enddef 542 543def Test_filter_missing_argument() 544 var dict = {aa: [1], ab: [2], ac: [3], de: [4]} 545 var res = dict->filter((k, _) => k =~ 'a' && k !~ 'b') 546 res->assert_equal({aa: [1], ac: [3]}) 547enddef 548 549def Test_garbagecollect() 550 garbagecollect(true) 551enddef 552 553def Test_getbufinfo() 554 var bufinfo = getbufinfo(bufnr()) 555 getbufinfo('%')->assert_equal(bufinfo) 556 557 edit Xtestfile1 558 hide edit Xtestfile2 559 hide enew 560 getbufinfo({bufloaded: true, buflisted: true, bufmodified: false}) 561 ->len()->assert_equal(3) 562 bwipe Xtestfile1 Xtestfile2 563enddef 564 565def Test_getbufline() 566 e SomeFile 567 var buf = bufnr() 568 e # 569 var lines = ['aaa', 'bbb', 'ccc'] 570 setbufline(buf, 1, lines) 571 getbufline('#', 1, '$')->assert_equal(lines) 572 getbufline(-1, '$', '$')->assert_equal([]) 573 getbufline(-1, 1, '$')->assert_equal([]) 574 575 bwipe! 576enddef 577 578def Test_getchangelist() 579 new 580 setline(1, 'some text') 581 var changelist = bufnr()->getchangelist() 582 getchangelist('%')->assert_equal(changelist) 583 bwipe! 584enddef 585 586def Test_getchar() 587 while getchar(0) 588 endwhile 589 getchar(true)->assert_equal(0) 590enddef 591 592def Test_getenv() 593 if getenv('does-not_exist') == '' 594 assert_report('getenv() should return null') 595 endif 596 if getenv('does-not_exist') == null 597 else 598 assert_report('getenv() should return null') 599 endif 600 $SOMEENVVAR = 'some' 601 assert_equal('some', getenv('SOMEENVVAR')) 602 unlet $SOMEENVVAR 603enddef 604 605def Test_getcompletion() 606 set wildignore=*.vim,*~ 607 var l = getcompletion('run', 'file', true) 608 l->assert_equal([]) 609 set wildignore& 610enddef 611 612def Test_getloclist_return_type() 613 var l = getloclist(1) 614 l->assert_equal([]) 615 616 var d = getloclist(1, {items: 0}) 617 d->assert_equal({items: []}) 618enddef 619 620def Test_getfperm() 621 assert_equal('', getfperm("")) 622 assert_equal('', getfperm(test_null_string())) 623 624 CheckDefExecFailure(['echo getfperm(true)'], 'E1174:') 625 CheckDefExecFailure(['echo getfperm(v:null)'], 'E1174:') 626enddef 627 628def Test_getfsize() 629 assert_equal(-1, getfsize("")) 630 assert_equal(-1, getfsize(test_null_string())) 631 632 CheckDefExecFailure(['echo getfsize(true)'], 'E1174:') 633 CheckDefExecFailure(['echo getfsize(v:null)'], 'E1174:') 634enddef 635 636def Test_getftime() 637 assert_equal(-1, getftime("")) 638 assert_equal(-1, getftime(test_null_string())) 639 640 CheckDefExecFailure(['echo getftime(true)'], 'E1174:') 641 CheckDefExecFailure(['echo getftime(v:null)'], 'E1174:') 642enddef 643 644def Test_getftype() 645 assert_equal('', getftype("")) 646 assert_equal('', getftype(test_null_string())) 647 648 CheckDefExecFailure(['echo getftype(true)'], 'E1174:') 649 CheckDefExecFailure(['echo getftype(v:null)'], 'E1174:') 650enddef 651 652def Test_getqflist_return_type() 653 var l = getqflist() 654 l->assert_equal([]) 655 656 var d = getqflist({items: 0}) 657 d->assert_equal({items: []}) 658enddef 659 660def Test_getreg() 661 var lines = ['aaa', 'bbb', 'ccc'] 662 setreg('a', lines) 663 getreg('a', true, true)->assert_equal(lines) 664 assert_fails('getreg("ab")', 'E1162:') 665enddef 666 667def Test_getreg_return_type() 668 var s1: string = getreg('"') 669 var s2: string = getreg('"', 1) 670 var s3: list<string> = getreg('"', 1, 1) 671enddef 672 673def Test_getreginfo() 674 var text = 'abc' 675 setreg('a', text) 676 getreginfo('a')->assert_equal({regcontents: [text], regtype: 'v', isunnamed: false}) 677 assert_fails('getreginfo("ab")', 'E1162:') 678enddef 679 680def Test_getregtype() 681 var lines = ['aaa', 'bbb', 'ccc'] 682 setreg('a', lines) 683 getregtype('a')->assert_equal('V') 684 assert_fails('getregtype("ab")', 'E1162:') 685enddef 686 687def Test_glob() 688 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim']) 689enddef 690 691def Test_globpath() 692 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim']) 693enddef 694 695def Test_has() 696 has('eval', true)->assert_equal(1) 697enddef 698 699def Test_hasmapto() 700 hasmapto('foobar', 'i', true)->assert_equal(0) 701 iabbrev foo foobar 702 hasmapto('foobar', 'i', true)->assert_equal(1) 703 iunabbrev foo 704enddef 705 706def Test_index() 707 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3) 708enddef 709 710let s:number_one = 1 711let s:number_two = 2 712let s:string_keep = 'keep' 713 714def Test_insert() 715 var l = insert([2, 1], 3) 716 var res = 0 717 for n in l 718 res += n 719 endfor 720 res->assert_equal(6) 721 722 var lines =<< trim END 723 insert(test_null_list(), 123) 724 END 725 CheckDefExecAndScriptFailure(lines, 'E1130:', 1) 726 727 lines =<< trim END 728 insert(test_null_blob(), 123) 729 END 730 CheckDefExecAndScriptFailure(lines, 'E1131:', 1) 731 732 assert_equal([1, 2, 3], insert([2, 3], 1)) 733 assert_equal([1, 2, 3], insert([2, 3], s:number_one)) 734 assert_equal([1, 2, 3], insert([1, 2], 3, 2)) 735 assert_equal([1, 2, 3], insert([1, 2], 3, s:number_two)) 736 assert_equal(['a', 'b', 'c'], insert(['b', 'c'], 'a')) 737 assert_equal(0z1234, insert(0z34, 0x12)) 738 739 CheckDefFailure(['insert([2, 3], "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 1) 740 CheckDefFailure(['insert([2, 3], 1, "x")'], 'E1013: Argument 3: type mismatch, expected number but got string', 1) 741enddef 742 743def Test_keys_return_type() 744 const var: list<string> = {a: 1, b: 2}->keys() 745 var->assert_equal(['a', 'b']) 746enddef 747 748def Test_line() 749 assert_fails('line(true)', 'E1174') 750enddef 751 752def Test_list2str_str2list_utf8() 753 var s = "\u3042\u3044" 754 var l = [0x3042, 0x3044] 755 str2list(s, true)->assert_equal(l) 756 list2str(l, true)->assert_equal(s) 757enddef 758 759def SID(): number 760 return expand('<SID>') 761 ->matchstr('<SNR>\zs\d\+\ze_$') 762 ->str2nr() 763enddef 764 765def Test_map_function_arg() 766 var lines =<< trim END 767 def MapOne(i: number, v: string): string 768 return i .. ':' .. v 769 enddef 770 var l = ['a', 'b', 'c'] 771 map(l, MapOne) 772 assert_equal(['0:a', '1:b', '2:c'], l) 773 END 774 CheckDefAndScriptSuccess(lines) 775enddef 776 777def Test_map_item_type() 778 var lines =<< trim END 779 var l = ['a', 'b', 'c'] 780 map(l, (k, v) => k .. '/' .. v ) 781 assert_equal(['0/a', '1/b', '2/c'], l) 782 END 783 CheckDefAndScriptSuccess(lines) 784 785 lines =<< trim END 786 var l: list<number> = [0] 787 echo map(l, (_, v) => []) 788 END 789 CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 2) 790 791 lines =<< trim END 792 var l: list<number> = range(2) 793 echo map(l, (_, v) => []) 794 END 795 CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 2) 796 797 lines =<< trim END 798 var d: dict<number> = {key: 0} 799 echo map(d, (_, v) => []) 800 END 801 CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 2) 802enddef 803 804def Test_maparg() 805 var lnum = str2nr(expand('<sflnum>')) 806 map foo bar 807 maparg('foo', '', false, true)->assert_equal({ 808 lnum: lnum + 1, 809 script: 0, 810 mode: ' ', 811 silent: 0, 812 noremap: 0, 813 lhs: 'foo', 814 lhsraw: 'foo', 815 nowait: 0, 816 expr: 0, 817 sid: SID(), 818 rhs: 'bar', 819 buffer: 0}) 820 unmap foo 821enddef 822 823def Test_mapcheck() 824 iabbrev foo foobar 825 mapcheck('foo', 'i', true)->assert_equal('foobar') 826 iunabbrev foo 827enddef 828 829def Test_maparg_mapset() 830 nnoremap <F3> :echo "hit F3"<CR> 831 var mapsave = maparg('<F3>', 'n', false, true) 832 mapset('n', false, mapsave) 833 834 nunmap <F3> 835enddef 836 837def Test_map_failure() 838 CheckFeature job 839 840 var lines =<< trim END 841 vim9script 842 writefile([], 'Xtmpfile') 843 silent e Xtmpfile 844 var d = {[bufnr('%')]: {a: 0}} 845 au BufReadPost * Func() 846 def Func() 847 if d->has_key('') 848 endif 849 eval d[expand('<abuf>')]->mapnew((_, v: dict<job>) => 0) 850 enddef 851 e 852 END 853 CheckScriptFailure(lines, 'E1013:') 854 au! BufReadPost 855 delete('Xtmpfile') 856enddef 857 858def Test_max() 859 g:flag = true 860 var l1: list<number> = g:flag 861 ? [1, max([2, 3])] 862 : [4, 5] 863 assert_equal([1, 3], l1) 864 865 g:flag = false 866 var l2: list<number> = g:flag 867 ? [1, max([2, 3])] 868 : [4, 5] 869 assert_equal([4, 5], l2) 870enddef 871 872def Test_min() 873 g:flag = true 874 var l1: list<number> = g:flag 875 ? [1, min([2, 3])] 876 : [4, 5] 877 assert_equal([1, 2], l1) 878 879 g:flag = false 880 var l2: list<number> = g:flag 881 ? [1, min([2, 3])] 882 : [4, 5] 883 assert_equal([4, 5], l2) 884enddef 885 886def Test_nr2char() 887 nr2char(97, true)->assert_equal('a') 888enddef 889 890def Test_readdir() 891 eval expand('sautest')->readdir((e) => e[0] !=# '.') 892 eval expand('sautest')->readdirex((e) => e.name[0] !=# '.') 893enddef 894 895def Test_readblob() 896 var blob = 0z12341234 897 writefile(blob, 'Xreadblob') 898 var read: blob = readblob('Xreadblob') 899 assert_equal(blob, read) 900 901 var lines =<< trim END 902 var read: list<string> = readblob('Xreadblob') 903 END 904 CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected list<string> but got blob', 1) 905 delete('Xreadblob') 906enddef 907 908def Test_readfile() 909 var text = ['aaa', 'bbb', 'ccc'] 910 writefile(text, 'Xreadfile') 911 var read: list<string> = readfile('Xreadfile') 912 assert_equal(text, read) 913 914 var lines =<< trim END 915 var read: dict<string> = readfile('Xreadfile') 916 END 917 CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<string> but got list<string>', 1) 918 delete('Xreadfile') 919enddef 920 921def Test_remove_return_type() 922 var l = remove({one: [1, 2], two: [3, 4]}, 'one') 923 var res = 0 924 for n in l 925 res += n 926 endfor 927 res->assert_equal(3) 928enddef 929 930def Test_reverse_return_type() 931 var l = reverse([1, 2, 3]) 932 var res = 0 933 for n in l 934 res += n 935 endfor 936 res->assert_equal(6) 937enddef 938 939def Test_search() 940 new 941 setline(1, ['foo', 'bar']) 942 var val = 0 943 # skip expr returns boolean 944 search('bar', 'W', 0, 0, () => val == 1)->assert_equal(2) 945 :1 946 search('bar', 'W', 0, 0, () => val == 0)->assert_equal(0) 947 # skip expr returns number, only 0 and 1 are accepted 948 :1 949 search('bar', 'W', 0, 0, () => 0)->assert_equal(2) 950 :1 951 search('bar', 'W', 0, 0, () => 1)->assert_equal(0) 952 assert_fails("search('bar', '', 0, 0, () => -1)", 'E1023:') 953 assert_fails("search('bar', '', 0, 0, () => -1)", 'E1023:') 954enddef 955 956def Test_searchcount() 957 new 958 setline(1, "foo bar") 959 :/foo 960 searchcount({recompute: true}) 961 ->assert_equal({ 962 exact_match: 1, 963 current: 1, 964 total: 1, 965 maxcount: 99, 966 incomplete: 0}) 967 bwipe! 968enddef 969 970def Test_set_get_bufline() 971 # similar to Test_setbufline_getbufline() 972 var lines =<< trim END 973 new 974 var b = bufnr('%') 975 hide 976 assert_equal(0, setbufline(b, 1, ['foo', 'bar'])) 977 assert_equal(['foo'], getbufline(b, 1)) 978 assert_equal(['bar'], getbufline(b, '$')) 979 assert_equal(['foo', 'bar'], getbufline(b, 1, 2)) 980 exe "bd!" b 981 assert_equal([], getbufline(b, 1, 2)) 982 983 split Xtest 984 setline(1, ['a', 'b', 'c']) 985 b = bufnr('%') 986 wincmd w 987 988 assert_equal(1, setbufline(b, 5, 'x')) 989 assert_equal(1, setbufline(b, 5, ['x'])) 990 assert_equal(1, setbufline(b, 5, [])) 991 assert_equal(1, setbufline(b, 5, test_null_list())) 992 993 assert_equal(1, 'x'->setbufline(bufnr('$') + 1, 1)) 994 assert_equal(1, ['x']->setbufline(bufnr('$') + 1, 1)) 995 assert_equal(1, []->setbufline(bufnr('$') + 1, 1)) 996 assert_equal(1, test_null_list()->setbufline(bufnr('$') + 1, 1)) 997 998 assert_equal(['a', 'b', 'c'], getbufline(b, 1, '$')) 999 1000 assert_equal(0, setbufline(b, 4, ['d', 'e'])) 1001 assert_equal(['c'], b->getbufline(3)) 1002 assert_equal(['d'], getbufline(b, 4)) 1003 assert_equal(['e'], getbufline(b, 5)) 1004 assert_equal([], getbufline(b, 6)) 1005 assert_equal([], getbufline(b, 2, 1)) 1006 1007 if has('job') 1008 setbufline(b, 2, [function('eval'), {key: 123}, test_null_job()]) 1009 assert_equal(["function('eval')", 1010 "{'key': 123}", 1011 "no process"], 1012 getbufline(b, 2, 4)) 1013 endif 1014 1015 exe 'bwipe! ' .. b 1016 END 1017 CheckDefAndScriptSuccess(lines) 1018enddef 1019 1020def Test_searchdecl() 1021 searchdecl('blah', true, true)->assert_equal(1) 1022enddef 1023 1024def Test_setbufvar() 1025 setbufvar(bufnr('%'), '&syntax', 'vim') 1026 &syntax->assert_equal('vim') 1027 setbufvar(bufnr('%'), '&ts', 16) 1028 &ts->assert_equal(16) 1029 setbufvar(bufnr('%'), '&ai', true) 1030 &ai->assert_equal(true) 1031 setbufvar(bufnr('%'), '&ft', 'filetype') 1032 &ft->assert_equal('filetype') 1033 1034 settabwinvar(1, 1, '&syntax', 'vam') 1035 &syntax->assert_equal('vam') 1036 settabwinvar(1, 1, '&ts', 15) 1037 &ts->assert_equal(15) 1038 setlocal ts=8 1039 settabwinvar(1, 1, '&list', false) 1040 &list->assert_equal(false) 1041 settabwinvar(1, 1, '&list', true) 1042 &list->assert_equal(true) 1043 setlocal list& 1044 1045 setbufvar('%', 'myvar', 123) 1046 getbufvar('%', 'myvar')->assert_equal(123) 1047enddef 1048 1049def Test_setloclist() 1050 var items = [{filename: '/tmp/file', lnum: 1, valid: true}] 1051 var what = {items: items} 1052 setqflist([], ' ', what) 1053 setloclist(0, [], ' ', what) 1054enddef 1055 1056def Test_setreg() 1057 setreg('a', ['aaa', 'bbb', 'ccc']) 1058 var reginfo = getreginfo('a') 1059 setreg('a', reginfo) 1060 getreginfo('a')->assert_equal(reginfo) 1061 assert_fails('setreg("ab", 0)', 'E1162:') 1062enddef 1063 1064def Test_slice() 1065 assert_equal('12345', slice('012345', 1)) 1066 assert_equal('123', slice('012345', 1, 4)) 1067 assert_equal('1234', slice('012345', 1, -1)) 1068 assert_equal('1', slice('012345', 1, -4)) 1069 assert_equal('', slice('012345', 1, -5)) 1070 assert_equal('', slice('012345', 1, -6)) 1071 1072 assert_equal([1, 2, 3, 4, 5], slice(range(6), 1)) 1073 assert_equal([1, 2, 3], slice(range(6), 1, 4)) 1074 assert_equal([1, 2, 3, 4], slice(range(6), 1, -1)) 1075 assert_equal([1], slice(range(6), 1, -4)) 1076 assert_equal([], slice(range(6), 1, -5)) 1077 assert_equal([], slice(range(6), 1, -6)) 1078 1079 assert_equal(0z1122334455, slice(0z001122334455, 1)) 1080 assert_equal(0z112233, slice(0z001122334455, 1, 4)) 1081 assert_equal(0z11223344, slice(0z001122334455, 1, -1)) 1082 assert_equal(0z11, slice(0z001122334455, 1, -4)) 1083 assert_equal(0z, slice(0z001122334455, 1, -5)) 1084 assert_equal(0z, slice(0z001122334455, 1, -6)) 1085enddef 1086 1087def Test_spellsuggest() 1088 if !has('spell') 1089 MissingFeature 'spell' 1090 else 1091 spellsuggest('marrch', 1, true)->assert_equal(['March']) 1092 endif 1093enddef 1094 1095def Test_sort_return_type() 1096 var res: list<number> 1097 res = [1, 2, 3]->sort() 1098enddef 1099 1100def Test_sort_argument() 1101 var lines =<< trim END 1102 var res = ['b', 'a', 'c']->sort('i') 1103 res->assert_equal(['a', 'b', 'c']) 1104 1105 def Compare(a: number, b: number): number 1106 return a - b 1107 enddef 1108 var l = [3, 6, 7, 1, 8, 2, 4, 5] 1109 sort(l, Compare) 1110 assert_equal([1, 2, 3, 4, 5, 6, 7, 8], l) 1111 END 1112 CheckDefAndScriptSuccess(lines) 1113enddef 1114 1115def Test_split() 1116 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', '']) 1117enddef 1118 1119def Run_str2float() 1120 if !has('float') 1121 MissingFeature 'float' 1122 endif 1123 str2float("1.00")->assert_equal(1.00) 1124 str2float("2e-2")->assert_equal(0.02) 1125 1126 CheckDefFailure(['echo str2float(123)'], 'E1013:') 1127 CheckScriptFailure(['vim9script', 'echo str2float(123)'], 'E1024:') 1128 endif 1129enddef 1130 1131def Test_str2nr() 1132 str2nr("1'000'000", 10, true)->assert_equal(1000000) 1133 1134 CheckDefFailure(['echo str2nr(123)'], 'E1013:') 1135 CheckScriptFailure(['vim9script', 'echo str2nr(123)'], 'E1024:') 1136 CheckDefFailure(['echo str2nr("123", "x")'], 'E1013:') 1137 CheckScriptFailure(['vim9script', 'echo str2nr("123", "x")'], 'E1030:') 1138 CheckDefFailure(['echo str2nr("123", 10, "x")'], 'E1013:') 1139 CheckScriptFailure(['vim9script', 'echo str2nr("123", 10, "x")'], 'E1135:') 1140enddef 1141 1142def Test_strchars() 1143 strchars("A\u20dd", true)->assert_equal(1) 1144enddef 1145 1146def Test_submatch() 1147 var pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)' 1148 var Rep = () => range(10)->mapnew((_, v) => submatch(v, true))->string() 1149 var actual = substitute('A123456789', pat, Rep, '') 1150 var expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]" 1151 actual->assert_equal(expected) 1152enddef 1153 1154def Test_synID() 1155 new 1156 setline(1, "text") 1157 synID(1, 1, true)->assert_equal(0) 1158 bwipe! 1159enddef 1160 1161def Test_term_gettty() 1162 if !has('terminal') 1163 MissingFeature 'terminal' 1164 else 1165 var buf = Run_shell_in_terminal({}) 1166 term_gettty(buf, true)->assert_notequal('') 1167 StopShellInTerminal(buf) 1168 endif 1169enddef 1170 1171def Test_term_start() 1172 if !has('terminal') 1173 MissingFeature 'terminal' 1174 else 1175 botright new 1176 var winnr = winnr() 1177 term_start(&shell, {curwin: true}) 1178 winnr()->assert_equal(winnr) 1179 bwipe! 1180 endif 1181enddef 1182 1183def Test_timer_paused() 1184 var id = timer_start(50, () => 0) 1185 timer_pause(id, true) 1186 var info = timer_info(id) 1187 info[0]['paused']->assert_equal(1) 1188 timer_stop(id) 1189enddef 1190 1191def Test_win_execute() 1192 assert_equal("\n" .. winnr(), win_execute(win_getid(), 'echo winnr()')) 1193 assert_equal('', win_execute(342343, 'echo winnr()')) 1194enddef 1195 1196def Test_win_splitmove() 1197 split 1198 win_splitmove(1, 2, {vertical: true, rightbelow: true}) 1199 close 1200enddef 1201 1202def Test_winrestcmd() 1203 split 1204 var cmd = winrestcmd() 1205 wincmd _ 1206 exe cmd 1207 assert_equal(cmd, winrestcmd()) 1208 close 1209enddef 1210 1211def Test_winsaveview() 1212 var view: dict<number> = winsaveview() 1213 1214 var lines =<< trim END 1215 var view: list<number> = winsaveview() 1216 END 1217 CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected list<number> but got dict<number>', 1) 1218enddef 1219 1220 1221 1222 1223" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 1224