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