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_expand() 189 split SomeFile 190 expand('%', true, true)->assert_equal(['SomeFile']) 191 close 192enddef 193 194def Test_extend_return_type() 195 var l = extend([1, 2], [3]) 196 var res = 0 197 for n in l 198 res += n 199 endfor 200 res->assert_equal(6) 201enddef 202 203 204def Wrong_dict_key_type(items: list<number>): list<number> 205 return filter(items, {_, val -> get({val: 1}, 'x')}) 206enddef 207 208def Test_filter_wrong_dict_key_type() 209 assert_fails('Wrong_dict_key_type([1, 2, 3])', 'E1012:') 210enddef 211 212def Test_filter_return_type() 213 var l = filter([1, 2, 3], {-> 1}) 214 var res = 0 215 for n in l 216 res += n 217 endfor 218 res->assert_equal(6) 219enddef 220 221 222def Test_garbagecollect() 223 garbagecollect(true) 224enddef 225 226def Test_getbufinfo() 227 var bufinfo = getbufinfo(bufnr()) 228 getbufinfo('%')->assert_equal(bufinfo) 229 230 edit Xtestfile1 231 hide edit Xtestfile2 232 hide enew 233 getbufinfo(#{bufloaded: true, buflisted: true, bufmodified: false}) 234 ->len()->assert_equal(3) 235 bwipe Xtestfile1 Xtestfile2 236enddef 237 238def Test_getbufline() 239 e SomeFile 240 var buf = bufnr() 241 e # 242 var lines = ['aaa', 'bbb', 'ccc'] 243 setbufline(buf, 1, lines) 244 getbufline('#', 1, '$')->assert_equal(lines) 245 getbufline(-1, '$', '$')->assert_equal([]) 246 getbufline(-1, 1, '$')->assert_equal([]) 247 248 bwipe! 249enddef 250 251def Test_getchangelist() 252 new 253 setline(1, 'some text') 254 var changelist = bufnr()->getchangelist() 255 getchangelist('%')->assert_equal(changelist) 256 bwipe! 257enddef 258 259def Test_getchar() 260 while getchar(0) 261 endwhile 262 getchar(true)->assert_equal(0) 263enddef 264 265def Test_getcompletion() 266 set wildignore=*.vim,*~ 267 var l = getcompletion('run', 'file', true) 268 l->assert_equal([]) 269 set wildignore& 270enddef 271 272def Test_getloclist_return_type() 273 var l = getloclist(1) 274 l->assert_equal([]) 275 276 var d = getloclist(1, #{items: 0}) 277 d->assert_equal(#{items: []}) 278enddef 279 280def Test_getqflist_return_type() 281 var l = getqflist() 282 l->assert_equal([]) 283 284 var d = getqflist(#{items: 0}) 285 d->assert_equal(#{items: []}) 286enddef 287 288def Test_getreg() 289 var lines = ['aaa', 'bbb', 'ccc'] 290 setreg('a', lines) 291 getreg('a', true, true)->assert_equal(lines) 292enddef 293 294def Test_getreg_return_type() 295 var s1: string = getreg('"') 296 var s2: string = getreg('"', 1) 297 var s3: list<string> = getreg('"', 1, 1) 298enddef 299 300def Test_glob() 301 glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim']) 302enddef 303 304def Test_globpath() 305 globpath('.', 'runtest.vim', true, true, true)->assert_equal(['./runtest.vim']) 306enddef 307 308def Test_has() 309 has('eval', true)->assert_equal(1) 310enddef 311 312def Test_hasmapto() 313 hasmapto('foobar', 'i', true)->assert_equal(0) 314 iabbrev foo foobar 315 hasmapto('foobar', 'i', true)->assert_equal(1) 316 iunabbrev foo 317enddef 318 319def Test_index() 320 index(['a', 'b', 'a', 'B'], 'b', 2, true)->assert_equal(3) 321enddef 322 323def Test_insert() 324 var l = insert([2, 1], 3) 325 var res = 0 326 for n in l 327 res += n 328 endfor 329 res->assert_equal(6) 330 331 assert_equal([1, 2, 3], insert([2, 3], 1)) 332 assert_equal([1, 2, 3], insert([1, 2], 3, 2)) 333 assert_equal(['a', 'b', 'c'], insert(['b', 'c'], 'a')) 334 assert_equal(0z1234, insert(0z34, 0x12)) 335 CheckDefFailure(['insert([2, 3], "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 1) 336 CheckDefFailure(['insert([2, 3], 1, "x")'], 'E1013: Argument 3: type mismatch, expected number but got string', 1) 337enddef 338 339def Test_keys_return_type() 340 const var: list<string> = #{a: 1, b: 2}->keys() 341 var->assert_equal(['a', 'b']) 342enddef 343 344def Test_list2str_str2list_utf8() 345 var s = "\u3042\u3044" 346 var l = [0x3042, 0x3044] 347 str2list(s, true)->assert_equal(l) 348 list2str(l, true)->assert_equal(s) 349enddef 350 351def SID(): number 352 return expand('<SID>') 353 ->matchstr('<SNR>\zs\d\+\ze_$') 354 ->str2nr() 355enddef 356 357def Test_maparg() 358 var lnum = str2nr(expand('<sflnum>')) 359 map foo bar 360 maparg('foo', '', false, true)->assert_equal(#{ 361 lnum: lnum + 1, 362 script: 0, 363 mode: ' ', 364 silent: 0, 365 noremap: 0, 366 lhs: 'foo', 367 lhsraw: 'foo', 368 nowait: 0, 369 expr: 0, 370 sid: SID(), 371 rhs: 'bar', 372 buffer: 0}) 373 unmap foo 374enddef 375 376def Test_mapcheck() 377 iabbrev foo foobar 378 mapcheck('foo', 'i', true)->assert_equal('foobar') 379 iunabbrev foo 380enddef 381 382def Test_maparg_mapset() 383 nnoremap <F3> :echo "hit F3"<CR> 384 var mapsave = maparg('<F3>', 'n', false, true) 385 mapset('n', false, mapsave) 386 387 nunmap <F3> 388enddef 389 390def Test_nr2char() 391 nr2char(97, true)->assert_equal('a') 392enddef 393 394def Test_readdir() 395 eval expand('sautest')->readdir({e -> e[0] !=# '.'}) 396 eval expand('sautest')->readdirex({e -> e.name[0] !=# '.'}) 397enddef 398 399def Test_remove_return_type() 400 var l = remove(#{one: [1, 2], two: [3, 4]}, 'one') 401 var res = 0 402 for n in l 403 res += n 404 endfor 405 res->assert_equal(3) 406enddef 407 408def Test_reverse_return_type() 409 var l = reverse([1, 2, 3]) 410 var res = 0 411 for n in l 412 res += n 413 endfor 414 res->assert_equal(6) 415enddef 416 417def Test_search() 418 new 419 setline(1, ['foo', 'bar']) 420 var val = 0 421 # skip expr returns boolean 422 search('bar', 'W', 0, 0, {-> val == 1})->assert_equal(2) 423 :1 424 search('bar', 'W', 0, 0, {-> val == 0})->assert_equal(0) 425 # skip expr returns number, only 0 and 1 are accepted 426 :1 427 search('bar', 'W', 0, 0, {-> 0})->assert_equal(2) 428 :1 429 search('bar', 'W', 0, 0, {-> 1})->assert_equal(0) 430 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:') 431 assert_fails("search('bar', '', 0, 0, {-> -1})", 'E1023:') 432enddef 433 434def Test_searchcount() 435 new 436 setline(1, "foo bar") 437 :/foo 438 searchcount(#{recompute: true}) 439 ->assert_equal(#{ 440 exact_match: 1, 441 current: 1, 442 total: 1, 443 maxcount: 99, 444 incomplete: 0}) 445 bwipe! 446enddef 447 448def Test_searchdecl() 449 searchdecl('blah', true, true)->assert_equal(1) 450enddef 451 452def Test_setbufvar() 453 setbufvar(bufnr('%'), '&syntax', 'vim') 454 &syntax->assert_equal('vim') 455 setbufvar(bufnr('%'), '&ts', 16) 456 &ts->assert_equal(16) 457 settabwinvar(1, 1, '&syntax', 'vam') 458 &syntax->assert_equal('vam') 459 settabwinvar(1, 1, '&ts', 15) 460 &ts->assert_equal(15) 461 setlocal ts=8 462 463 setbufvar('%', 'myvar', 123) 464 getbufvar('%', 'myvar')->assert_equal(123) 465enddef 466 467def Test_setloclist() 468 var items = [#{filename: '/tmp/file', lnum: 1, valid: true}] 469 var what = #{items: items} 470 setqflist([], ' ', what) 471 setloclist(0, [], ' ', what) 472enddef 473 474def Test_setreg() 475 setreg('a', ['aaa', 'bbb', 'ccc']) 476 var reginfo = getreginfo('a') 477 setreg('a', reginfo) 478 getreginfo('a')->assert_equal(reginfo) 479enddef 480 481def Test_spellsuggest() 482 if !has('spell') 483 MissingFeature 'spell' 484 else 485 spellsuggest('marrch', 1, true)->assert_equal(['March']) 486 endif 487enddef 488 489def Test_sort_return_type() 490 var res: list<number> 491 res = [1, 2, 3]->sort() 492enddef 493 494def Test_sort_argument() 495 var res = ['b', 'a', 'c']->sort('i') 496 res->assert_equal(['a', 'b', 'c']) 497enddef 498 499def Test_split() 500 split(' aa bb ', '\W\+', true)->assert_equal(['', 'aa', 'bb', '']) 501enddef 502 503def Test_str2nr() 504 str2nr("1'000'000", 10, true)->assert_equal(1000000) 505enddef 506 507def Test_strchars() 508 strchars("A\u20dd", true)->assert_equal(1) 509enddef 510 511def Test_submatch() 512 var pat = 'A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)' 513 var Rep = {-> range(10)->map({_, v -> submatch(v, true)})->string()} 514 var actual = substitute('A123456789', pat, Rep, '') 515 var expected = "[['A123456789'], ['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']]" 516 actual->assert_equal(expected) 517enddef 518 519def Test_synID() 520 new 521 setline(1, "text") 522 synID(1, 1, true)->assert_equal(0) 523 bwipe! 524enddef 525 526def Test_term_gettty() 527 if !has('terminal') 528 MissingFeature 'terminal' 529 else 530 var buf = Run_shell_in_terminal({}) 531 term_gettty(buf, true)->assert_notequal('') 532 StopShellInTerminal(buf) 533 endif 534enddef 535 536def Test_term_start() 537 if !has('terminal') 538 MissingFeature 'terminal' 539 else 540 botright new 541 var winnr = winnr() 542 term_start(&shell, #{curwin: true}) 543 winnr()->assert_equal(winnr) 544 bwipe! 545 endif 546enddef 547 548def Test_timer_paused() 549 var id = timer_start(50, {-> 0}) 550 timer_pause(id, true) 551 var info = timer_info(id) 552 info[0]['paused']->assert_equal(1) 553 timer_stop(id) 554enddef 555 556def Test_win_splitmove() 557 split 558 win_splitmove(1, 2, #{vertical: true, rightbelow: true}) 559 close 560enddef 561 562 563" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 564