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)) 126enddef 127 128def Test_buflisted() 129 var res: bool = buflisted('asdf') 130 assert_equal(false, res) 131enddef 132 133def Test_bufname() 134 split SomeFile 135 bufname('%')->assert_equal('SomeFile') 136 edit OtherFile 137 bufname('#')->assert_equal('SomeFile') 138 close 139enddef 140 141def Test_bufnr() 142 var buf = bufnr() 143 bufnr('%')->assert_equal(buf) 144 145 buf = bufnr('Xdummy', true) 146 buf->assert_notequal(-1) 147 exe 'bwipe! ' .. buf 148enddef 149 150def Test_bufwinid() 151 var origwin = win_getid() 152 below split SomeFile 153 var SomeFileID = win_getid() 154 below split OtherFile 155 below split SomeFile 156 bufwinid('SomeFile')->assert_equal(SomeFileID) 157 158 win_gotoid(origwin) 159 only 160 bwipe SomeFile 161 bwipe OtherFile 162enddef 163 164def Test_call_call() 165 var l = [3, 2, 1] 166 call('reverse', [l]) 167 l->assert_equal([1, 2, 3]) 168enddef 169 170def Test_char2nr() 171 char2nr('あ', true)->assert_equal(12354) 172enddef 173 174def Test_col() 175 new 176 setline(1, 'asdf') 177 col([1, '$'])->assert_equal(5) 178enddef 179 180def Test_copy_return_type() 181 var l = copy([1, 2, 3]) 182 var res = 0 183 for n in l 184 res += n 185 endfor 186 res->assert_equal(6) 187 188 var dl = deepcopy([1, 2, 3]) 189 res = 0 190 for n in dl 191 res += n 192 endfor 193 res->assert_equal(6) 194 195 dl = deepcopy([1, 2, 3], true) 196enddef 197 198def Test_count() 199 count('ABC ABC ABC', 'b', true)->assert_equal(3) 200 count('ABC ABC ABC', 'b', false)->assert_equal(0) 201enddef 202 203def Test_cursor() 204 new 205 setline(1, range(4)) 206 cursor(2, 1) 207 assert_equal(2, getcurpos()[1]) 208 cursor('$', 1) 209 assert_equal(4, getcurpos()[1]) 210 211 var lines =<< trim END 212 cursor('2', 1) 213 END 214 CheckDefExecAndScriptFailure(lines, 'E475:') 215enddef 216 217def Test_delete() 218 var res: bool = delete('doesnotexist') 219 assert_equal(true, res) 220enddef 221 222def Test_executable() 223 assert_false(executable("")) 224 assert_false(executable(test_null_string())) 225 226 CheckDefExecFailure(['echo executable(123)'], 'E928:') 227 CheckDefExecFailure(['echo executable(true)'], 'E928:') 228enddef 229 230def Test_exepath() 231 CheckDefExecFailure(['echo exepath(true)'], 'E928:') 232 CheckDefExecFailure(['echo exepath(v:null)'], 'E928:') 233 CheckDefExecFailure(['echo exepath("")'], 'E1142:') 234enddef 235 236def Test_expand() 237 split SomeFile 238 expand('%', true, true)->assert_equal(['SomeFile']) 239 close 240enddef 241 242def Test_extend_arg_types() 243 assert_equal([1, 2, 3], extend([1, 2], [3])) 244 assert_equal([3, 1, 2], extend([1, 2], [3], 0)) 245 assert_equal([1, 3, 2], extend([1, 2], [3], 1)) 246 assert_equal([1, 3, 2], extend([1, 2], [3], s:number_one)) 247 248 assert_equal({a: 1, b: 2, c: 3}, extend({a: 1, b: 2}, {c: 3})) 249 assert_equal({a: 1, b: 4}, extend({a: 1, b: 2}, {b: 4})) 250 assert_equal({a: 1, b: 2}, extend({a: 1, b: 2}, {b: 4}, 'keep')) 251 assert_equal({a: 1, b: 2}, extend({a: 1, b: 2}, {b: 4}, s:string_keep)) 252 253 var res: list<dict<any>> 254 extend(res, mapnew([1, 2], (_, v) => ({}))) 255 assert_equal([{}, {}], res) 256 257 CheckDefFailure(['extend([1, 2], 3)'], 'E1013: Argument 2: type mismatch, expected list<number> but got number') 258 CheckDefFailure(['extend([1, 2], ["x"])'], 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>') 259 CheckDefFailure(['extend([1, 2], [3], "x")'], 'E1013: Argument 3: type mismatch, expected number but got string') 260 261 CheckDefFailure(['extend({a: 1}, 42)'], 'E1013: Argument 2: type mismatch, expected dict<number> but got number') 262 CheckDefFailure(['extend({a: 1}, {b: "x"})'], 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>') 263 CheckDefFailure(['extend({a: 1}, {b: 2}, 1)'], 'E1013: Argument 3: type mismatch, expected string but got number') 264 265 CheckDefFailure(['extend([1], ["b"])'], 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>') 266 CheckDefExecFailure(['extend([1], ["b", 1])'], 'E1013: Argument 2: type mismatch, expected list<number> but got list<any>') 267enddef 268 269def Test_extendnew() 270 assert_equal([1, 2, 'a'], extendnew([1, 2], ['a'])) 271 assert_equal({one: 1, two: 'a'}, extendnew({one: 1}, {two: 'a'})) 272 273 CheckDefFailure(['extendnew({a: 1}, 42)'], 'E1013: Argument 2: type mismatch, expected dict<number> but got number') 274 CheckDefFailure(['extendnew({a: 1}, [42])'], 'E1013: Argument 2: type mismatch, expected dict<number> but got list<number>') 275 CheckDefFailure(['extendnew([1, 2], "x")'], 'E1013: Argument 2: type mismatch, expected list<number> but got string') 276 CheckDefFailure(['extendnew([1, 2], {x: 1})'], 'E1013: Argument 2: type mismatch, expected list<number> but got dict<number>') 277enddef 278 279def Test_extend_return_type() 280 var l = extend([1, 2], [3]) 281 var res = 0 282 for n in l 283 res += n 284 endfor 285 res->assert_equal(6) 286enddef 287 288func g:ExtendDict(d) 289 call extend(a:d, #{xx: 'x'}) 290endfunc 291 292def Test_extend_dict_item_type() 293 var lines =<< trim END 294 var d: dict<number> = {a: 1} 295 extend(d, {b: 2}) 296 END 297 CheckDefAndScriptSuccess(lines) 298 299 lines =<< trim END 300 var d: dict<number> = {a: 1} 301 extend(d, {b: 'x'}) 302 END 303 CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected dict<number> but got dict<string>', 2) 304 CheckScriptFailure(['vim9script'] + lines, 'E1012:', 3) 305 306 lines =<< trim END 307 var d: dict<number> = {a: 1} 308 g:ExtendDict(d) 309 END 310 CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string', 0) 311 CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1) 312enddef 313 314func g:ExtendList(l) 315 call extend(a:l, ['x']) 316endfunc 317 318def Test_extend_list_item_type() 319 var lines =<< trim END 320 var l: list<number> = [1] 321 extend(l, [2]) 322 END 323 CheckDefAndScriptSuccess(lines) 324 325 lines =<< trim END 326 var l: list<number> = [1] 327 extend(l, ['x']) 328 END 329 CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected list<number> but got list<string>', 2) 330 CheckScriptFailure(['vim9script'] + lines, 'E1012:', 3) 331 332 lines =<< trim END 333 var l: list<number> = [1] 334 g:ExtendList(l) 335 END 336 CheckDefExecFailure(lines, 'E1012: Type mismatch; expected number but got string', 0) 337 CheckScriptFailure(['vim9script'] + lines, 'E1012:', 1) 338enddef 339 340def Test_job_info_return_type() 341 if has('job') 342 job_start(&shell) 343 var jobs = job_info() 344 assert_equal('list<job>', typename(jobs)) 345 assert_equal('dict<any>', typename(job_info(jobs[0]))) 346 job_stop(jobs[0]) 347 endif 348enddef 349 350def Wrong_dict_key_type(items: list<number>): list<number> 351 return filter(items, (_, val) => get({[val]: 1}, 'x')) 352enddef 353 354def Test_filereadable() 355 assert_false(filereadable("")) 356 assert_false(filereadable(test_null_string())) 357 358 CheckDefExecFailure(['echo filereadable(123)'], 'E928:') 359 CheckDefExecFailure(['echo filereadable(true)'], 'E928:') 360enddef 361 362def Test_filewritable() 363 assert_false(filewritable("")) 364 assert_false(filewritable(test_null_string())) 365 366 CheckDefExecFailure(['echo filewritable(123)'], 'E928:') 367 CheckDefExecFailure(['echo filewritable(true)'], 'E928:') 368enddef 369 370def Test_finddir() 371 CheckDefExecFailure(['echo finddir(true)'], 'E928:') 372 CheckDefExecFailure(['echo finddir(v:null)'], 'E928:') 373 CheckDefExecFailure(['echo finddir("")'], 'E1142:') 374enddef 375 376def Test_findfile() 377 CheckDefExecFailure(['echo findfile(true)'], 'E928:') 378 CheckDefExecFailure(['echo findfile(v:null)'], 'E928:') 379 CheckDefExecFailure(['echo findfile("")'], 'E1142:') 380enddef 381 382def Test_fnamemodify() 383 CheckDefSuccess(['echo fnamemodify(test_null_string(), ":p")']) 384 CheckDefSuccess(['echo fnamemodify("", ":p")']) 385 CheckDefSuccess(['echo fnamemodify("file", test_null_string())']) 386 CheckDefSuccess(['echo fnamemodify("file", "")']) 387 388 CheckDefExecFailure(['echo fnamemodify(true, ":p")'], 'E928:') 389 CheckDefExecFailure(['echo fnamemodify(v:null, ":p")'], 'E928:') 390 CheckDefExecFailure(['echo fnamemodify("file", true)'], 'E928:') 391enddef 392 393def Test_filter_wrong_dict_key_type() 394 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1012:') 395enddef 396 397def Test_filter_return_type() 398 var l = filter([1, 2, 3], () => 1) 399 var res = 0 400 for n in l 401 res += n 402 endfor 403 res->assert_equal(6) 404enddef 405 406def Test_filter_missing_argument() 407 var dict = {aa: [1], ab: [2], ac: [3], de: [4]} 408 var res = dict->filter((k) => k =~ 'a' && k !~ 'b') 409 res->assert_equal({aa: [1], ac: [3]}) 410enddef 411 412def Test_garbagecollect() 413 garbagecollect(true) 414enddef 415 416def Test_getbufinfo() 417 var bufinfo = getbufinfo(bufnr()) 418 getbufinfo('%')->assert_equal(bufinfo) 419 420 edit Xtestfile1 421 hide edit Xtestfile2 422 hide enew 423 getbufinfo({bufloaded: true, buflisted: true, bufmodified: false}) 424 ->len()->assert_equal(3) 425 bwipe Xtestfile1 Xtestfile2 426enddef 427 428def Test_getbufline() 429 e SomeFile 430 var buf = bufnr() 431 e # 432 var lines = ['aaa', 'bbb', 'ccc'] 433 setbufline(buf, 1, lines) 434 getbufline('#', 1, '$')->assert_equal(lines) 435 getbufline(-1, '$', '$')->assert_equal([]) 436 getbufline(-1, 1, '$')->assert_equal([]) 437 438 bwipe! 439enddef 440 441def Test_getchangelist() 442 new 443 setline(1, 'some text') 444 var changelist = bufnr()->getchangelist() 445 getchangelist('%')->assert_equal(changelist) 446 bwipe! 447enddef 448 449def Test_getchar() 450 while getchar(0) 451 endwhile 452 getchar(true)->assert_equal(0) 453enddef 454 455def Test_getcompletion() 456 set wildignore=*.vim,*~ 457 var l = getcompletion('run', 'file', true) 458 l->assert_equal([]) 459 set wildignore& 460enddef 461 462def Test_getloclist_return_type() 463 var l = getloclist(1) 464 l->assert_equal([]) 465 466 var d = getloclist(1, {items: 0}) 467 d->assert_equal({items: []}) 468enddef 469 470def Test_getfperm() 471 assert_equal('', getfperm("")) 472 assert_equal('', getfperm(test_null_string())) 473 474 CheckDefExecFailure(['echo getfperm(true)'], 'E928:') 475 CheckDefExecFailure(['echo getfperm(v:null)'], 'E928:') 476enddef 477 478def Test_getfsize() 479 assert_equal(-1, getfsize("")) 480 assert_equal(-1, getfsize(test_null_string())) 481 482 CheckDefExecFailure(['echo getfsize(true)'], 'E928:') 483 CheckDefExecFailure(['echo getfsize(v:null)'], 'E928:') 484enddef 485 486def Test_getftime() 487 assert_equal(-1, getftime("")) 488 assert_equal(-1, getftime(test_null_string())) 489 490 CheckDefExecFailure(['echo getftime(true)'], 'E928:') 491 CheckDefExecFailure(['echo getftime(v:null)'], 'E928:') 492enddef 493 494def Test_getftype() 495 assert_equal('', getftype("")) 496 assert_equal('', getftype(test_null_string())) 497 498 CheckDefExecFailure(['echo getftype(true)'], 'E928:') 499 CheckDefExecFailure(['echo getftype(v:null)'], 'E928:') 500enddef 501 502def Test_getqflist_return_type() 503 var l = getqflist() 504 l->assert_equal([]) 505 506 var d = getqflist({items: 0}) 507 d->assert_equal({items: []}) 508enddef 509 510def Test_getreg() 511 var lines = ['aaa', 'bbb', 'ccc'] 512 setreg('a', lines) 513 getreg('a', true, true)->assert_equal(lines) 514enddef 515 516def Test_getreg_return_type() 517 var s1: string = getreg('"') 518 var s2: string = getreg('"', 1) 519 var s3: list<string> = getreg('"', 1, 1) 520enddef 521 522def Test_glob() 523 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim']) 524enddef 525 526def Test_globpath() 527 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim']) 528enddef 529 530def Test_has() 531 has('eval', true)->assert_equal(1) 532enddef 533 534def Test_hasmapto() 535 hasmapto('foobar', 'i', true)->assert_equal(0) 536 iabbrev foo foobar 537 hasmapto('foobar', 'i', true)->assert_equal(1) 538 iunabbrev foo 539enddef 540 541def Test_index() 542 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3) 543enddef 544 545let s:number_one = 1 546let s:number_two = 2 547let s:string_keep = 'keep' 548 549def Test_insert() 550 var l = insert([2, 1], 3) 551 var res = 0 552 for n in l 553 res += n 554 endfor 555 res->assert_equal(6) 556 557 assert_equal([1, 2, 3], insert([2, 3], 1)) 558 assert_equal([1, 2, 3], insert([2, 3], s:number_one)) 559 assert_equal([1, 2, 3], insert([1, 2], 3, 2)) 560 assert_equal([1, 2, 3], insert([1, 2], 3, s:number_two)) 561 assert_equal(['a', 'b', 'c'], insert(['b', 'c'], 'a')) 562 assert_equal(0z1234, insert(0z34, 0x12)) 563 564 CheckDefFailure(['insert([2, 3], "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 1) 565 CheckDefFailure(['insert([2, 3], 1, "x")'], 'E1013: Argument 3: type mismatch, expected number but got string', 1) 566enddef 567 568def Test_keys_return_type() 569 const var: list<string> = {a: 1, b: 2}->keys() 570 var->assert_equal(['a', 'b']) 571enddef 572 573def Test_list2str_str2list_utf8() 574 var s = "\u3042\u3044" 575 var l = [0x3042, 0x3044] 576 str2list(s, true)->assert_equal(l) 577 list2str(l, true)->assert_equal(s) 578enddef 579 580def SID(): number 581 return expand('<SID>') 582 ->matchstr('<SNR>\zs\d\+\ze_$') 583 ->str2nr() 584enddef 585 586def Test_map_function_arg() 587 var lines =<< trim END 588 def MapOne(i: number, v: string): string 589 return i .. ':' .. v 590 enddef 591 var l = ['a', 'b', 'c'] 592 map(l, MapOne) 593 assert_equal(['0:a', '1:b', '2:c'], l) 594 END 595 CheckDefAndScriptSuccess(lines) 596enddef 597 598def Test_map_item_type() 599 var lines =<< trim END 600 var l = ['a', 'b', 'c'] 601 map(l, (k, v) => k .. '/' .. v ) 602 assert_equal(['0/a', '1/b', '2/c'], l) 603 END 604 CheckDefAndScriptSuccess(lines) 605 606 lines =<< trim END 607 var l: list<number> = [0] 608 echo map(l, (_, v) => []) 609 END 610 CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 2) 611 612 lines =<< trim END 613 var l: list<number> = range(2) 614 echo map(l, (_, v) => []) 615 END 616 CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 2) 617 618 lines =<< trim END 619 var d: dict<number> = {key: 0} 620 echo map(d, (_, v) => []) 621 END 622 CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got list<unknown>', 2) 623enddef 624 625def Test_maparg() 626 var lnum = str2nr(expand('<sflnum>')) 627 map foo bar 628 maparg('foo', '', false, true)->assert_equal({ 629 lnum: lnum + 1, 630 script: 0, 631 mode: ' ', 632 silent: 0, 633 noremap: 0, 634 lhs: 'foo', 635 lhsraw: 'foo', 636 nowait: 0, 637 expr: 0, 638 sid: SID(), 639 rhs: 'bar', 640 buffer: 0}) 641 unmap foo 642enddef 643 644def Test_mapcheck() 645 iabbrev foo foobar 646 mapcheck('foo', 'i', true)->assert_equal('foobar') 647 iunabbrev foo 648enddef 649 650def Test_maparg_mapset() 651 nnoremap <F3> :echo "hit F3"<CR> 652 var mapsave = maparg('<F3>', 'n', false, true) 653 mapset('n', false, mapsave) 654 655 nunmap <F3> 656enddef 657 658def Test_max() 659 g:flag = true 660 var l1: list<number> = g:flag 661 ? [1, max([2, 3])] 662 : [4, 5] 663 assert_equal([1, 3], l1) 664 665 g:flag = false 666 var l2: list<number> = g:flag 667 ? [1, max([2, 3])] 668 : [4, 5] 669 assert_equal([4, 5], l2) 670enddef 671 672def Test_min() 673 g:flag = true 674 var l1: list<number> = g:flag 675 ? [1, min([2, 3])] 676 : [4, 5] 677 assert_equal([1, 2], l1) 678 679 g:flag = false 680 var l2: list<number> = g:flag 681 ? [1, min([2, 3])] 682 : [4, 5] 683 assert_equal([4, 5], l2) 684enddef 685 686def Test_nr2char() 687 nr2char(97, true)->assert_equal('a') 688enddef 689 690def Test_readdir() 691 eval expand('sautest')->readdir((e) => e[0] !=# '.') 692 eval expand('sautest')->readdirex((e) => e.name[0] !=# '.') 693enddef 694 695def Test_readblob() 696 var blob = 0z12341234 697 writefile(blob, 'Xreadblob') 698 var read: blob = readblob('Xreadblob') 699 assert_equal(blob, read) 700 701 var lines =<< trim END 702 var read: list<string> = readblob('Xreadblob') 703 END 704 CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected list<string> but got blob', 1) 705 delete('Xreadblob') 706enddef 707 708def Test_readfile() 709 var text = ['aaa', 'bbb', 'ccc'] 710 writefile(text, 'Xreadfile') 711 var read: list<string> = readfile('Xreadfile') 712 assert_equal(text, read) 713 714 var lines =<< trim END 715 var read: dict<string> = readfile('Xreadfile') 716 END 717 CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected dict<string> but got list<string>', 1) 718 delete('Xreadfile') 719enddef 720 721def Test_remove_return_type() 722 var l = remove({one: [1, 2], two: [3, 4]}, 'one') 723 var res = 0 724 for n in l 725 res += n 726 endfor 727 res->assert_equal(3) 728enddef 729 730def Test_reverse_return_type() 731 var l = reverse([1, 2, 3]) 732 var res = 0 733 for n in l 734 res += n 735 endfor 736 res->assert_equal(6) 737enddef 738 739def Test_search() 740 new 741 setline(1, ['foo', 'bar']) 742 var val = 0 743 # skip expr returns boolean 744 search('bar', 'W', 0, 0, () => val == 1)->assert_equal(2) 745 :1 746 search('bar', 'W', 0, 0, () => val == 0)->assert_equal(0) 747 # skip expr returns number, only 0 and 1 are accepted 748 :1 749 search('bar', 'W', 0, 0, () => 0)->assert_equal(2) 750 :1 751 search('bar', 'W', 0, 0, () => 1)->assert_equal(0) 752 assert_fails("search('bar', '', 0, 0, () => -1)", 'E1023:') 753 assert_fails("search('bar', '', 0, 0, () => -1)", 'E1023:') 754enddef 755 756def Test_searchcount() 757 new 758 setline(1, "foo bar") 759 :/foo 760 searchcount({recompute: true}) 761 ->assert_equal({ 762 exact_match: 1, 763 current: 1, 764 total: 1, 765 maxcount: 99, 766 incomplete: 0}) 767 bwipe! 768enddef 769 770def Test_searchdecl() 771 searchdecl('blah', true, true)->assert_equal(1) 772enddef 773 774def Test_setbufvar() 775 setbufvar(bufnr('%'), '&syntax', 'vim') 776 &syntax->assert_equal('vim') 777 setbufvar(bufnr('%'), '&ts', 16) 778 &ts->assert_equal(16) 779 setbufvar(bufnr('%'), '&ai', true) 780 &ai->assert_equal(true) 781 setbufvar(bufnr('%'), '&ft', 'filetype') 782 &ft->assert_equal('filetype') 783 784 settabwinvar(1, 1, '&syntax', 'vam') 785 &syntax->assert_equal('vam') 786 settabwinvar(1, 1, '&ts', 15) 787 &ts->assert_equal(15) 788 setlocal ts=8 789 settabwinvar(1, 1, '&list', false) 790 &list->assert_equal(false) 791 settabwinvar(1, 1, '&list', true) 792 &list->assert_equal(true) 793 setlocal list& 794 795 setbufvar('%', 'myvar', 123) 796 getbufvar('%', 'myvar')->assert_equal(123) 797enddef 798 799def Test_setloclist() 800 var items = [{filename: '/tmp/file', lnum: 1, valid: true}] 801 var what = {items: items} 802 setqflist([], ' ', what) 803 setloclist(0, [], ' ', what) 804enddef 805 806def Test_setreg() 807 setreg('a', ['aaa', 'bbb', 'ccc']) 808 var reginfo = getreginfo('a') 809 setreg('a', reginfo) 810 getreginfo('a')->assert_equal(reginfo) 811enddef 812 813def Test_slice() 814 assert_equal('12345', slice('012345', 1)) 815 assert_equal('123', slice('012345', 1, 4)) 816 assert_equal('1234', slice('012345', 1, -1)) 817 assert_equal('1', slice('012345', 1, -4)) 818 assert_equal('', slice('012345', 1, -5)) 819 assert_equal('', slice('012345', 1, -6)) 820 821 assert_equal([1, 2, 3, 4, 5], slice(range(6), 1)) 822 assert_equal([1, 2, 3], slice(range(6), 1, 4)) 823 assert_equal([1, 2, 3, 4], slice(range(6), 1, -1)) 824 assert_equal([1], slice(range(6), 1, -4)) 825 assert_equal([], slice(range(6), 1, -5)) 826 assert_equal([], slice(range(6), 1, -6)) 827 828 assert_equal(0z1122334455, slice(0z001122334455, 1)) 829 assert_equal(0z112233, slice(0z001122334455, 1, 4)) 830 assert_equal(0z11223344, slice(0z001122334455, 1, -1)) 831 assert_equal(0z11, slice(0z001122334455, 1, -4)) 832 assert_equal(0z, slice(0z001122334455, 1, -5)) 833 assert_equal(0z, slice(0z001122334455, 1, -6)) 834enddef 835 836def Test_spellsuggest() 837 if !has('spell') 838 MissingFeature 'spell' 839 else 840 spellsuggest('marrch', 1, true)->assert_equal(['March']) 841 endif 842enddef 843 844def Test_sort_return_type() 845 var res: list<number> 846 res = [1, 2, 3]->sort() 847enddef 848 849def Test_sort_argument() 850 var lines =<< trim END 851 var res = ['b', 'a', 'c']->sort('i') 852 res->assert_equal(['a', 'b', 'c']) 853 854 def Compare(a: number, b: number): number 855 return a - b 856 enddef 857 var l = [3, 6, 7, 1, 8, 2, 4, 5] 858 sort(l, Compare) 859 assert_equal([1, 2, 3, 4, 5, 6, 7, 8], l) 860 END 861 CheckDefAndScriptSuccess(lines) 862enddef 863 864def Test_split() 865 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', '']) 866enddef 867 868def Test_str2nr() 869 str2nr("1'000'000", 10, true)->assert_equal(1000000) 870enddef 871 872def Test_strchars() 873 strchars("A\u20dd", true)->assert_equal(1) 874enddef 875 876def Test_submatch() 877 var pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)' 878 var Rep = () => range(10)->mapnew((_, v) => submatch(v, true))->string() 879 var actual = substitute('A123456789', pat, Rep, '') 880 var expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]" 881 actual->assert_equal(expected) 882enddef 883 884def Test_synID() 885 new 886 setline(1, "text") 887 synID(1, 1, true)->assert_equal(0) 888 bwipe! 889enddef 890 891def Test_term_gettty() 892 if !has('terminal') 893 MissingFeature 'terminal' 894 else 895 var buf = Run_shell_in_terminal({}) 896 term_gettty(buf, true)->assert_notequal('') 897 StopShellInTerminal(buf) 898 endif 899enddef 900 901def Test_term_start() 902 if !has('terminal') 903 MissingFeature 'terminal' 904 else 905 botright new 906 var winnr = winnr() 907 term_start(&shell, {curwin: true}) 908 winnr()->assert_equal(winnr) 909 bwipe! 910 endif 911enddef 912 913def Test_timer_paused() 914 var id = timer_start(50, () => 0) 915 timer_pause(id, true) 916 var info = timer_info(id) 917 info[0]['paused']->assert_equal(1) 918 timer_stop(id) 919enddef 920 921def Test_win_execute() 922 assert_equal("\n" .. winnr(), win_execute(win_getid(), 'echo winnr()')) 923 assert_equal('', win_execute(342343, 'echo winnr()')) 924enddef 925 926def Test_win_splitmove() 927 split 928 win_splitmove(1, 2, {vertical: true, rightbelow: true}) 929 close 930enddef 931 932def Test_winrestcmd() 933 split 934 var cmd = winrestcmd() 935 wincmd _ 936 exe cmd 937 assert_equal(cmd, winrestcmd()) 938 close 939enddef 940 941def Test_winsaveview() 942 var view: dict<number> = winsaveview() 943 944 var lines =<< trim END 945 var view: list<number> = winsaveview() 946 END 947 CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected list<number> but got dict<number>', 1) 948enddef 949 950 951 952 953" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 954