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 var l: list<number> = test_null_list() 91 add(l, 123) 92 END 93 CheckDefExecFailure(lines, 'E1130:', 2) 94enddef 95 96def Test_add_blob() 97 var b1: blob = 0z12 98 add(b1, 0x34) 99 assert_equal(0z1234, b1) 100 101 var b2: blob # defaults to empty blob 102 add(b2, 0x67) 103 assert_equal(0z67, b2) 104 105 var lines =<< trim END 106 var b: blob 107 add(b, "x") 108 END 109 CheckDefFailure(lines, 'E1012:', 2) 110 111 lines =<< trim END 112 var b: blob = test_null_blob() 113 add(b, 123) 114 END 115 CheckDefExecFailure(lines, 'E1131:', 2) 116enddef 117 118def Test_bufname() 119 split SomeFile 120 bufname('%')->assert_equal('SomeFile') 121 edit OtherFile 122 bufname('#')->assert_equal('SomeFile') 123 close 124enddef 125 126def Test_bufnr() 127 var buf = bufnr() 128 bufnr('%')->assert_equal(buf) 129 130 buf = bufnr('Xdummy', true) 131 buf->assert_notequal(-1) 132 exe 'bwipe! ' .. buf 133enddef 134 135def Test_bufwinid() 136 var origwin = win_getid() 137 below split SomeFile 138 var SomeFileID = win_getid() 139 below split OtherFile 140 below split SomeFile 141 bufwinid('SomeFile')->assert_equal(SomeFileID) 142 143 win_gotoid(origwin) 144 only 145 bwipe SomeFile 146 bwipe OtherFile 147enddef 148 149def Test_call_call() 150 var l = [3, 2, 1] 151 call('reverse', [l]) 152 l->assert_equal([1, 2, 3]) 153enddef 154 155def Test_char2nr() 156 char2nr('あ', true)->assert_equal(12354) 157enddef 158 159def Test_col() 160 new 161 setline(1, 'asdf') 162 col([1, '$'])->assert_equal(5) 163enddef 164 165def Test_copy_return_type() 166 var l = copy([1, 2, 3]) 167 var res = 0 168 for n in l 169 res += n 170 endfor 171 res->assert_equal(6) 172 173 var dl = deepcopy([1, 2, 3]) 174 res = 0 175 for n in dl 176 res += n 177 endfor 178 res->assert_equal(6) 179 180 dl = deepcopy([1, 2, 3], true) 181enddef 182 183def Test_count() 184 count('ABC ABC ABC', 'b', true)->assert_equal(3) 185 count('ABC ABC ABC', 'b', false)->assert_equal(0) 186enddef 187 188def Test_executable() 189 assert_false(executable("")) 190 assert_false(executable(test_null_string())) 191 192 CheckDefExecFailure(['echo executable(123)'], 'E928:') 193 CheckDefExecFailure(['echo executable(true)'], 'E928:') 194enddef 195 196def Test_exepath() 197 CheckDefExecFailure(['echo exepath(true)'], 'E928:') 198 CheckDefExecFailure(['echo exepath(v:null)'], 'E928:') 199 CheckDefExecFailure(['echo exepath("")'], 'E1142:') 200enddef 201 202def Test_expand() 203 split SomeFile 204 expand('%', true, true)->assert_equal(['SomeFile']) 205 close 206enddef 207 208def Test_extend_arg_types() 209 assert_equal([1, 2, 3], extend([1, 2], [3])) 210 assert_equal([3, 1, 2], extend([1, 2], [3], 0)) 211 assert_equal([1, 3, 2], extend([1, 2], [3], 1)) 212 assert_equal([1, 3, 2], extend([1, 2], [3], s:number_one)) 213 214 assert_equal({a: 1, b: 2, c: 3}, extend({a: 1, b: 2}, {c: 3})) 215 assert_equal({a: 1, b: 4}, extend({a: 1, b: 2}, {b: 4})) 216 assert_equal({a: 1, b: 2}, extend({a: 1, b: 2}, {b: 4}, 'keep')) 217 assert_equal({a: 1, b: 2}, extend({a: 1, b: 2}, {b: 4}, s:string_keep)) 218 219 var res: list<dict<any>> 220 extend(res, map([1, 2], {_, v -> {}})) 221 assert_equal([{}, {}], res) 222 223 CheckDefFailure(['extend([1, 2], 3)'], 'E1013: Argument 2: type mismatch, expected list<number> but got number') 224 CheckDefFailure(['extend([1, 2], ["x"])'], 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>') 225 CheckDefFailure(['extend([1, 2], [3], "x")'], 'E1013: Argument 3: type mismatch, expected number but got string') 226 227 CheckDefFailure(['extend({a: 1}, 42)'], 'E1013: Argument 2: type mismatch, expected dict<number> but got number') 228 CheckDefFailure(['extend({a: 1}, {b: "x"})'], 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>') 229 CheckDefFailure(['extend({a: 1}, {b: 2}, 1)'], 'E1013: Argument 3: type mismatch, expected string but got number') 230enddef 231 232def Test_extend_return_type() 233 var l = extend([1, 2], [3]) 234 var res = 0 235 for n in l 236 res += n 237 endfor 238 res->assert_equal(6) 239enddef 240 241 242def Wrong_dict_key_type(items: list<number>): list<number> 243 return filter(items, {_, val -> get({[val]: 1}, 'x')}) 244enddef 245 246def Test_map_function_arg() 247 var lines =<< trim END 248 def MapOne(i: number, v: string): string 249 return i .. ':' .. v 250 enddef 251 var l = ['a', 'b', 'c'] 252 map(l, MapOne) 253 assert_equal(['0:a', '1:b', '2:c'], l) 254 END 255 CheckDefAndScriptSuccess(lines) 256enddef 257 258def Test_filereadable() 259 assert_false(filereadable("")) 260 assert_false(filereadable(test_null_string())) 261 262 CheckDefExecFailure(['echo filereadable(123)'], 'E928:') 263 CheckDefExecFailure(['echo filereadable(true)'], 'E928:') 264enddef 265 266def Test_filewritable() 267 assert_false(filewritable("")) 268 assert_false(filewritable(test_null_string())) 269 270 CheckDefExecFailure(['echo filewritable(123)'], 'E928:') 271 CheckDefExecFailure(['echo filewritable(true)'], 'E928:') 272enddef 273 274def Test_finddir() 275 CheckDefExecFailure(['echo finddir(true)'], 'E928:') 276 CheckDefExecFailure(['echo finddir(v:null)'], 'E928:') 277 CheckDefExecFailure(['echo finddir("")'], 'E1142:') 278enddef 279 280def Test_findfile() 281 CheckDefExecFailure(['echo findfile(true)'], 'E928:') 282 CheckDefExecFailure(['echo findfile(v:null)'], 'E928:') 283 CheckDefExecFailure(['echo findfile("")'], 'E1142:') 284enddef 285 286def Test_fnamemodify() 287 CheckDefSuccess(['echo fnamemodify(test_null_string(), ":p")']) 288 CheckDefSuccess(['echo fnamemodify("", ":p")']) 289 CheckDefSuccess(['echo fnamemodify("file", test_null_string())']) 290 CheckDefSuccess(['echo fnamemodify("file", "")']) 291 292 CheckDefExecFailure(['echo fnamemodify(true, ":p")'], 'E928:') 293 CheckDefExecFailure(['echo fnamemodify(v:null, ":p")'], 'E928:') 294 CheckDefExecFailure(['echo fnamemodify("file", true)'], 'E928:') 295enddef 296 297def Test_filter_wrong_dict_key_type() 298 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1012:') 299enddef 300 301def Test_filter_return_type() 302 var l = filter([1, 2, 3], {-> 1}) 303 var res = 0 304 for n in l 305 res += n 306 endfor 307 res->assert_equal(6) 308enddef 309 310 311def Test_garbagecollect() 312 garbagecollect(true) 313enddef 314 315def Test_getbufinfo() 316 var bufinfo = getbufinfo(bufnr()) 317 getbufinfo('%')->assert_equal(bufinfo) 318 319 edit Xtestfile1 320 hide edit Xtestfile2 321 hide enew 322 getbufinfo({bufloaded: true, buflisted: true, bufmodified: false}) 323 ->len()->assert_equal(3) 324 bwipe Xtestfile1 Xtestfile2 325enddef 326 327def Test_getbufline() 328 e SomeFile 329 var buf = bufnr() 330 e # 331 var lines = ['aaa', 'bbb', 'ccc'] 332 setbufline(buf, 1, lines) 333 getbufline('#', 1, '$')->assert_equal(lines) 334 getbufline(-1, '$', '$')->assert_equal([]) 335 getbufline(-1, 1, '$')->assert_equal([]) 336 337 bwipe! 338enddef 339 340def Test_getchangelist() 341 new 342 setline(1, 'some text') 343 var changelist = bufnr()->getchangelist() 344 getchangelist('%')->assert_equal(changelist) 345 bwipe! 346enddef 347 348def Test_getchar() 349 while getchar(0) 350 endwhile 351 getchar(true)->assert_equal(0) 352enddef 353 354def Test_getcompletion() 355 set wildignore=*.vim,*~ 356 var l = getcompletion('run', 'file', true) 357 l->assert_equal([]) 358 set wildignore& 359enddef 360 361def Test_getloclist_return_type() 362 var l = getloclist(1) 363 l->assert_equal([]) 364 365 var d = getloclist(1, {items: 0}) 366 d->assert_equal({items: []}) 367enddef 368 369def Test_getfperm() 370 assert_equal('', getfperm("")) 371 assert_equal('', getfperm(test_null_string())) 372 373 CheckDefExecFailure(['echo getfperm(true)'], 'E928:') 374 CheckDefExecFailure(['echo getfperm(v:null)'], 'E928:') 375enddef 376 377def Test_getfsize() 378 assert_equal(-1, getfsize("")) 379 assert_equal(-1, getfsize(test_null_string())) 380 381 CheckDefExecFailure(['echo getfsize(true)'], 'E928:') 382 CheckDefExecFailure(['echo getfsize(v:null)'], 'E928:') 383enddef 384 385def Test_getftime() 386 assert_equal(-1, getftime("")) 387 assert_equal(-1, getftime(test_null_string())) 388 389 CheckDefExecFailure(['echo getftime(true)'], 'E928:') 390 CheckDefExecFailure(['echo getftime(v:null)'], 'E928:') 391enddef 392 393def Test_getftype() 394 assert_equal('', getftype("")) 395 assert_equal('', getftype(test_null_string())) 396 397 CheckDefExecFailure(['echo getftype(true)'], 'E928:') 398 CheckDefExecFailure(['echo getftype(v:null)'], 'E928:') 399enddef 400 401def Test_getqflist_return_type() 402 var l = getqflist() 403 l->assert_equal([]) 404 405 var d = getqflist({items: 0}) 406 d->assert_equal({items: []}) 407enddef 408 409def Test_getreg() 410 var lines = ['aaa', 'bbb', 'ccc'] 411 setreg('a', lines) 412 getreg('a', true, true)->assert_equal(lines) 413enddef 414 415def Test_getreg_return_type() 416 var s1: string = getreg('"') 417 var s2: string = getreg('"', 1) 418 var s3: list<string> = getreg('"', 1, 1) 419enddef 420 421def Test_glob() 422 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim']) 423enddef 424 425def Test_globpath() 426 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim']) 427enddef 428 429def Test_has() 430 has('eval', true)->assert_equal(1) 431enddef 432 433def Test_hasmapto() 434 hasmapto('foobar', 'i', true)->assert_equal(0) 435 iabbrev foo foobar 436 hasmapto('foobar', 'i', true)->assert_equal(1) 437 iunabbrev foo 438enddef 439 440def Test_index() 441 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3) 442enddef 443 444let s:number_one = 1 445let s:number_two = 2 446let s:string_keep = 'keep' 447 448def Test_insert() 449 var l = insert([2, 1], 3) 450 var res = 0 451 for n in l 452 res += n 453 endfor 454 res->assert_equal(6) 455 456 assert_equal([1, 2, 3], insert([2, 3], 1)) 457 assert_equal([1, 2, 3], insert([2, 3], s:number_one)) 458 assert_equal([1, 2, 3], insert([1, 2], 3, 2)) 459 assert_equal([1, 2, 3], insert([1, 2], 3, s:number_two)) 460 assert_equal(['a', 'b', 'c'], insert(['b', 'c'], 'a')) 461 assert_equal(0z1234, insert(0z34, 0x12)) 462 463 CheckDefFailure(['insert([2, 3], "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 1) 464 CheckDefFailure(['insert([2, 3], 1, "x")'], 'E1013: Argument 3: type mismatch, expected number but got string', 1) 465enddef 466 467def Test_keys_return_type() 468 const var: list<string> = {a: 1, b: 2}->keys() 469 var->assert_equal(['a', 'b']) 470enddef 471 472def Test_list2str_str2list_utf8() 473 var s = "\u3042\u3044" 474 var l = [0x3042, 0x3044] 475 str2list(s, true)->assert_equal(l) 476 list2str(l, true)->assert_equal(s) 477enddef 478 479def SID(): number 480 return expand('<SID>') 481 ->matchstr('<SNR>\zs\d\+\ze_$') 482 ->str2nr() 483enddef 484 485def Test_maparg() 486 var lnum = str2nr(expand('<sflnum>')) 487 map foo bar 488 maparg('foo', '', false, true)->assert_equal({ 489 lnum: lnum + 1, 490 script: 0, 491 mode: ' ', 492 silent: 0, 493 noremap: 0, 494 lhs: 'foo', 495 lhsraw: 'foo', 496 nowait: 0, 497 expr: 0, 498 sid: SID(), 499 rhs: 'bar', 500 buffer: 0}) 501 unmap foo 502enddef 503 504def Test_mapcheck() 505 iabbrev foo foobar 506 mapcheck('foo', 'i', true)->assert_equal('foobar') 507 iunabbrev foo 508enddef 509 510def Test_maparg_mapset() 511 nnoremap <F3> :echo "hit F3"<CR> 512 var mapsave = maparg('<F3>', 'n', false, true) 513 mapset('n', false, mapsave) 514 515 nunmap <F3> 516enddef 517 518def Test_nr2char() 519 nr2char(97, true)->assert_equal('a') 520enddef 521 522def Test_readdir() 523 eval expand('sautest')->readdir({e -> e[0] !=# '.'}) 524 eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'}) 525enddef 526 527def Test_remove_return_type() 528 var l = remove({one: [1, 2], two: [3, 4]}, 'one') 529 var res = 0 530 for n in l 531 res += n 532 endfor 533 res->assert_equal(3) 534enddef 535 536def Test_reverse_return_type() 537 var l = reverse([1, 2, 3]) 538 var res = 0 539 for n in l 540 res += n 541 endfor 542 res->assert_equal(6) 543enddef 544 545def Test_search() 546 new 547 setline(1, ['foo', 'bar']) 548 var val = 0 549 # skip expr returns boolean 550 search('bar', 'W', 0, 0, {-> val == 1})->assert_equal(2) 551 :1 552 search('bar', 'W', 0, 0, {-> val == 0})->assert_equal(0) 553 # skip expr returns number, only 0 and 1 are accepted 554 :1 555 search('bar', 'W', 0, 0, {-> 0})->assert_equal(2) 556 :1 557 search('bar', 'W', 0, 0, {-> 1})->assert_equal(0) 558 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:') 559 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:') 560enddef 561 562def Test_searchcount() 563 new 564 setline(1, "foo bar") 565 :/foo 566 searchcount({recompute: true}) 567 ->assert_equal({ 568 exact_match: 1, 569 current: 1, 570 total: 1, 571 maxcount: 99, 572 incomplete: 0}) 573 bwipe! 574enddef 575 576def Test_searchdecl() 577 searchdecl('blah', true, true)->assert_equal(1) 578enddef 579 580def Test_setbufvar() 581 setbufvar(bufnr('%'), '&syntax', 'vim') 582 &syntax->assert_equal('vim') 583 setbufvar(bufnr('%'), '&ts', 16) 584 &ts->assert_equal(16) 585 settabwinvar(1, 1, '&syntax', 'vam') 586 &syntax->assert_equal('vam') 587 settabwinvar(1, 1, '&ts', 15) 588 &ts->assert_equal(15) 589 setlocal ts=8 590 591 setbufvar('%', 'myvar', 123) 592 getbufvar('%', 'myvar')->assert_equal(123) 593enddef 594 595def Test_setloclist() 596 var items = [{filename: '/tmp/file', lnum: 1, valid: true}] 597 var what = {items: items} 598 setqflist([], ' ', what) 599 setloclist(0, [], ' ', what) 600enddef 601 602def Test_setreg() 603 setreg('a', ['aaa', 'bbb', 'ccc']) 604 var reginfo = getreginfo('a') 605 setreg('a', reginfo) 606 getreginfo('a')->assert_equal(reginfo) 607enddef 608 609def Test_spellsuggest() 610 if !has('spell') 611 MissingFeature 'spell' 612 else 613 spellsuggest('marrch', 1, true)->assert_equal(['March']) 614 endif 615enddef 616 617def Test_sort_return_type() 618 var res: list<number> 619 res = [1, 2, 3]->sort() 620enddef 621 622def Test_sort_argument() 623 var lines =<< trim END 624 var res = ['b', 'a', 'c']->sort('i') 625 res->assert_equal(['a', 'b', 'c']) 626 627 def Compare(a: number, b: number): number 628 return a - b 629 enddef 630 var l = [3, 6, 7, 1, 8, 2, 4, 5] 631 sort(l, Compare) 632 assert_equal([1, 2, 3, 4, 5, 6, 7, 8], l) 633 END 634 CheckDefAndScriptSuccess(lines) 635enddef 636 637def Test_split() 638 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', '']) 639enddef 640 641def Test_str2nr() 642 str2nr("1'000'000", 10, true)->assert_equal(1000000) 643enddef 644 645def Test_strchars() 646 strchars("A\u20dd", true)->assert_equal(1) 647enddef 648 649def Test_submatch() 650 var pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)' 651 var Rep = {-> range(10)->map({_, v -> submatch(v, true)})->string()} 652 var actual = substitute('A123456789', pat, Rep, '') 653 var expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]" 654 actual->assert_equal(expected) 655enddef 656 657def Test_synID() 658 new 659 setline(1, "text") 660 synID(1, 1, true)->assert_equal(0) 661 bwipe! 662enddef 663 664def Test_term_gettty() 665 if !has('terminal') 666 MissingFeature 'terminal' 667 else 668 var buf = Run_shell_in_terminal({}) 669 term_gettty(buf, true)->assert_notequal('') 670 StopShellInTerminal(buf) 671 endif 672enddef 673 674def Test_term_start() 675 if !has('terminal') 676 MissingFeature 'terminal' 677 else 678 botright new 679 var winnr = winnr() 680 term_start(&shell, {curwin: true}) 681 winnr()->assert_equal(winnr) 682 bwipe! 683 endif 684enddef 685 686def Test_timer_paused() 687 var id = timer_start(50, {-> 0}) 688 timer_pause(id, true) 689 var info = timer_info(id) 690 info[0]['paused']->assert_equal(1) 691 timer_stop(id) 692enddef 693 694def Test_win_splitmove() 695 split 696 win_splitmove(1, 2, {vertical: true, rightbelow: true}) 697 close 698enddef 699 700 701" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 702