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