comparison src/testdir/test_vim9_builtin.vim @ 25272:712e867f9721 v8.2.3173

patch 8.2.3173: Vim9: argument types are not checked at compile time Commit: https://github.com/vim/vim/commit/a9a7c0c602b231dc37c4b0f62ade0421c84fca03 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sat Jul 17 19:11:07 2021 +0200 patch 8.2.3173: Vim9: argument types are not checked at compile time Problem: Vim9: argument types are not checked at compile time. Solution: Add more type checks. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/8581)
author Bram Moolenaar <Bram@vim.org>
date Sat, 17 Jul 2021 19:15:05 +0200
parents a3c07227ffde
children ddc38de331ff
comparison
equal deleted inserted replaced
25271:51a7e859b0de 25272:712e867f9721
471 471
472 def Test_char2nr() 472 def Test_char2nr()
473 char2nr('あ', true)->assert_equal(12354) 473 char2nr('あ', true)->assert_equal(12354)
474 474
475 assert_fails('char2nr(true)', 'E1174:') 475 assert_fails('char2nr(true)', 'E1174:')
476 CheckDefAndScriptFailure2(['char2nr(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1')
477 CheckDefAndScriptFailure2(['char2nr("a", 2)'], 'E1013: Argument 2: type mismatch, expected bool but got number', 'E1211: Bool required for argument 2')
478 assert_equal(97, char2nr('a', 1))
479 assert_equal(97, char2nr('a', 0))
480 assert_equal(97, char2nr('a', true))
481 assert_equal(97, char2nr('a', false))
476 enddef 482 enddef
477 483
478 def Test_charclass() 484 def Test_charclass()
479 assert_fails('charclass(true)', 'E1174:') 485 assert_fails('charclass(true)', 'E1174:')
480 enddef 486 enddef
598 def Test_diff_filler() 604 def Test_diff_filler()
599 CheckDefFailure(['diff_filler([])'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>') 605 CheckDefFailure(['diff_filler([])'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>')
600 CheckDefFailure(['diff_filler(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool') 606 CheckDefFailure(['diff_filler(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool')
601 assert_equal(0, diff_filler(1)) 607 assert_equal(0, diff_filler(1))
602 assert_equal(0, diff_filler('.')) 608 assert_equal(0, diff_filler('.'))
609 enddef
610
611 def Test_diff_hlID()
612 CheckDefAndScriptFailure2(['diff_hlID(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
613 CheckDefAndScriptFailure2(['diff_hlID(1, "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2')
603 enddef 614 enddef
604 615
605 def Test_echoraw() 616 def Test_echoraw()
606 CheckDefAndScriptFailure2(['echoraw(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') 617 CheckDefAndScriptFailure2(['echoraw(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1')
607 CheckDefAndScriptFailure2(['echoraw(["x"])'], 'E1013: Argument 1: type mismatch, expected string but got list<string>', 'E1174: String required for argument 1') 618 CheckDefAndScriptFailure2(['echoraw(["x"])'], 'E1013: Argument 1: type mismatch, expected string but got list<string>', 'E1174: String required for argument 1')
1597 CheckScriptFailure(lines, 'E1013:') 1608 CheckScriptFailure(lines, 'E1013:')
1598 au! BufReadPost 1609 au! BufReadPost
1599 delete('Xtmpfile') 1610 delete('Xtmpfile')
1600 enddef 1611 enddef
1601 1612
1613 def Test_match()
1614 CheckDefAndScriptFailure2(['match(0z12, "p")'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
1615 CheckDefAndScriptFailure2(['match(["s"], [2])'], 'E1013: Argument 2: type mismatch, expected string but got list<number>', 'E1174: String required for argument 2')
1616 CheckDefAndScriptFailure2(['match("s", "p", "q")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3')
1617 CheckDefAndScriptFailure2(['match("s", "p", 1, "r")'], 'E1013: Argument 4: type mismatch, expected number but got string', 'E1210: Number required for argument 4')
1618 assert_equal(2, match('ab12cd', '12'))
1619 assert_equal(-1, match('ab12cd', '34'))
1620 assert_equal(6, match('ab12cd12ef', '12', 4))
1621 assert_equal(2, match('abcd', '..', 0, 3))
1622 assert_equal(1, match(['a', 'b', 'c'], 'b'))
1623 assert_equal(-1, match(['a', 'b', 'c'], 'd'))
1624 assert_equal(3, match(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2))
1625 assert_equal(5, match(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2, 2))
1626 enddef
1627
1602 def Test_matcharg() 1628 def Test_matcharg()
1603 CheckDefFailure(['matcharg("x")'], 'E1013: Argument 1: type mismatch, expected number but got string') 1629 CheckDefFailure(['matcharg("x")'], 'E1013: Argument 1: type mismatch, expected number but got string')
1604 enddef 1630 enddef
1605 1631
1606 def Test_matchdelete() 1632 def Test_matchdelete()
1607 CheckDefFailure(['matchdelete("x")'], 'E1013: Argument 1: type mismatch, expected number but got string') 1633 CheckDefFailure(['matchdelete("x")'], 'E1013: Argument 1: type mismatch, expected number but got string')
1608 CheckDefFailure(['matchdelete("x", 1)'], 'E1013: Argument 1: type mismatch, expected number but got string') 1634 CheckDefFailure(['matchdelete("x", 1)'], 'E1013: Argument 1: type mismatch, expected number but got string')
1609 CheckDefFailure(['matchdelete(1, "x")'], 'E1013: Argument 2: type mismatch, expected number but got string') 1635 CheckDefFailure(['matchdelete(1, "x")'], 'E1013: Argument 2: type mismatch, expected number but got string')
1636 enddef
1637
1638 def Test_matchend()
1639 CheckDefAndScriptFailure2(['matchend(0z12, "p")'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
1640 CheckDefAndScriptFailure2(['matchend(["s"], [2])'], 'E1013: Argument 2: type mismatch, expected string but got list<number>', 'E1174: String required for argument 2')
1641 CheckDefAndScriptFailure2(['matchend("s", "p", "q")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3')
1642 CheckDefAndScriptFailure2(['matchend("s", "p", 1, "r")'], 'E1013: Argument 4: type mismatch, expected number but got string', 'E1210: Number required for argument 4')
1643 assert_equal(4, matchend('ab12cd', '12'))
1644 assert_equal(-1, matchend('ab12cd', '34'))
1645 assert_equal(8, matchend('ab12cd12ef', '12', 4))
1646 assert_equal(4, matchend('abcd', '..', 0, 3))
1647 assert_equal(1, matchend(['a', 'b', 'c'], 'b'))
1648 assert_equal(-1, matchend(['a', 'b', 'c'], 'd'))
1649 assert_equal(3, matchend(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2))
1650 assert_equal(5, matchend(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2, 2))
1651 enddef
1652
1653 def Test_matchlist()
1654 CheckDefAndScriptFailure2(['matchlist(0z12, "p")'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
1655 CheckDefAndScriptFailure2(['matchlist(["s"], [2])'], 'E1013: Argument 2: type mismatch, expected string but got list<number>', 'E1174: String required for argument 2')
1656 CheckDefAndScriptFailure2(['matchlist("s", "p", "q")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3')
1657 CheckDefAndScriptFailure2(['matchlist("s", "p", 1, "r")'], 'E1013: Argument 4: type mismatch, expected number but got string', 'E1210: Number required for argument 4')
1658 var l: list<string> = ['12', '', '', '', '', '', '', '', '', '']
1659 assert_equal(l, matchlist('ab12cd', '12'))
1660 assert_equal([], matchlist('ab12cd', '34'))
1661 assert_equal(l, matchlist('ab12cd12ef', '12', 4))
1662 l[0] = 'cd'
1663 assert_equal(l, matchlist('abcd', '..', 0, 3))
1664 l[0] = 'b'
1665 assert_equal(l, matchlist(['a', 'b', 'c'], 'b'))
1666 assert_equal([], matchlist(['a', 'b', 'c'], 'd'))
1667 assert_equal(l, matchlist(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2))
1668 assert_equal(l, matchlist(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2, 2))
1669 enddef
1670
1671 def Test_matchstr()
1672 CheckDefAndScriptFailure2(['matchstr(0z12, "p")'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
1673 CheckDefAndScriptFailure2(['matchstr(["s"], [2])'], 'E1013: Argument 2: type mismatch, expected string but got list<number>', 'E1174: String required for argument 2')
1674 CheckDefAndScriptFailure2(['matchstr("s", "p", "q")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3')
1675 CheckDefAndScriptFailure2(['matchstr("s", "p", 1, "r")'], 'E1013: Argument 4: type mismatch, expected number but got string', 'E1210: Number required for argument 4')
1676 assert_equal('12', matchstr('ab12cd', '12'))
1677 assert_equal('', matchstr('ab12cd', '34'))
1678 assert_equal('12', matchstr('ab12cd12ef', '12', 4))
1679 assert_equal('cd', matchstr('abcd', '..', 0, 3))
1680 assert_equal('b', matchstr(['a', 'b', 'c'], 'b'))
1681 assert_equal('', matchstr(['a', 'b', 'c'], 'd'))
1682 assert_equal('b', matchstr(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2))
1683 assert_equal('b', matchstr(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2, 2))
1684 enddef
1685
1686 def Test_matchstrpos()
1687 CheckDefAndScriptFailure2(['matchstrpos(0z12, "p")'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
1688 CheckDefAndScriptFailure2(['matchstrpos(["s"], [2])'], 'E1013: Argument 2: type mismatch, expected string but got list<number>', 'E1174: String required for argument 2')
1689 CheckDefAndScriptFailure2(['matchstrpos("s", "p", "q")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3')
1690 CheckDefAndScriptFailure2(['matchstrpos("s", "p", 1, "r")'], 'E1013: Argument 4: type mismatch, expected number but got string', 'E1210: Number required for argument 4')
1691 assert_equal(['12', 2, 4], matchstrpos('ab12cd', '12'))
1692 assert_equal(['', -1, -1], matchstrpos('ab12cd', '34'))
1693 assert_equal(['12', 6, 8], matchstrpos('ab12cd12ef', '12', 4))
1694 assert_equal(['cd', 2, 4], matchstrpos('abcd', '..', 0, 3))
1695 assert_equal(['b', 1, 0, 1], matchstrpos(['a', 'b', 'c'], 'b'))
1696 assert_equal(['', -1, -1, -1], matchstrpos(['a', 'b', 'c'], 'd'))
1697 assert_equal(['b', 3, 0, 1],
1698 matchstrpos(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2))
1699 assert_equal(['b', 5, 0, 1],
1700 matchstrpos(['a', 'b', 'c', 'b', 'd', 'b'], 'b', 2, 2))
1610 enddef 1701 enddef
1611 1702
1612 def Test_max() 1703 def Test_max()
1613 g:flag = true 1704 g:flag = true
1614 var l1: list<number> = g:flag 1705 var l1: list<number> = g:flag
1788 def Test_prompt_getprompt() 1879 def Test_prompt_getprompt()
1789 if has('channel') 1880 if has('channel')
1790 CheckDefFailure(['prompt_getprompt([])'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>') 1881 CheckDefFailure(['prompt_getprompt([])'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>')
1791 assert_equal('', prompt_getprompt('NonExistingBuf')) 1882 assert_equal('', prompt_getprompt('NonExistingBuf'))
1792 endif 1883 endif
1884 enddef
1885
1886 def Test_prompt_setprompt()
1887 if !has('channel')
1888 CheckFeature channel
1889 endif
1890 CheckDefAndScriptFailure2(['prompt_setprompt([], "p")'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 1')
1891 CheckDefAndScriptFailure2(['prompt_setprompt(1, [])'], 'E1013: Argument 2: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 2')
1793 enddef 1892 enddef
1794 1893
1795 def Test_prop_find() 1894 def Test_prop_find()
1796 CheckDefAndScriptFailure2(['prop_find([1, 2])'], 'E1013: Argument 1: type mismatch, expected dict<any> but got list<number>', 'E715: Dictionary required') 1895 CheckDefAndScriptFailure2(['prop_find([1, 2])'], 'E1013: Argument 1: type mismatch, expected dict<any> but got list<number>', 'E715: Dictionary required')
1797 CheckDefAndScriptFailure2(['prop_find([1, 2], "k")'], 'E1013: Argument 1: type mismatch, expected dict<any> but got list<number>', 'E715: Dictionary required') 1896 CheckDefAndScriptFailure2(['prop_find([1, 2], "k")'], 'E1013: Argument 1: type mismatch, expected dict<any> but got list<number>', 'E715: Dictionary required')
2405 CheckDefFailure(['str2float(123)'], 'E1013:') 2504 CheckDefFailure(['str2float(123)'], 'E1013:')
2406 CheckScriptFailure(['vim9script', 'echo str2float(123)'], 'E1024:') 2505 CheckScriptFailure(['vim9script', 'echo str2float(123)'], 'E1024:')
2407 endif 2506 endif
2408 enddef 2507 enddef
2409 2508
2509 def Test_str2list()
2510 CheckDefAndScriptFailure2(['str2list(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1')
2511 CheckDefAndScriptFailure2(['str2list("a", 2)'], 'E1013: Argument 2: type mismatch, expected bool but got number', 'E1211: Bool required for argument 2')
2512 assert_equal([97], str2list('a'))
2513 assert_equal([97], str2list('a', 1))
2514 assert_equal([97], str2list('a', true))
2515 enddef
2516
2410 def Test_str2nr() 2517 def Test_str2nr()
2411 str2nr("1'000'000", 10, true)->assert_equal(1000000) 2518 str2nr("1'000'000", 10, true)->assert_equal(1000000)
2412 2519
2413 CheckDefFailure(['str2nr(123)'], 'E1013:') 2520 CheckDefFailure(['str2nr(123)'], 'E1013:')
2414 CheckScriptFailure(['vim9script', 'echo str2nr(123)'], 'E1024:') 2521 CheckScriptFailure(['vim9script', 'echo str2nr(123)'], 'E1024:')
2424 strcharlen(99)->assert_equal(2) 2531 strcharlen(99)->assert_equal(2)
2425 enddef 2532 enddef
2426 2533
2427 def Test_strchars() 2534 def Test_strchars()
2428 strchars("A\u20dd", true)->assert_equal(1) 2535 strchars("A\u20dd", true)->assert_equal(1)
2536 CheckDefAndScriptFailure2(['strchars(10)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1')
2537 CheckDefAndScriptFailure2(['strchars("a", 2)'], 'E1013: Argument 2: type mismatch, expected bool but got number', 'E1211: Bool required for argument 2')
2538 assert_equal(3, strchars('abc'))
2539 assert_equal(3, strchars('abc', 1))
2540 assert_equal(3, strchars('abc', true))
2429 enddef 2541 enddef
2430 2542
2431 def Test_strdisplaywidth() 2543 def Test_strdisplaywidth()
2432 CheckDefAndScriptFailure2(['strdisplaywidth(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') 2544 CheckDefAndScriptFailure2(['strdisplaywidth(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1')
2433 CheckDefAndScriptFailure2(['strdisplaywidth("a", "x")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') 2545 CheckDefAndScriptFailure2(['strdisplaywidth("a", "x")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2')
2519 2631
2520 def Test_synIDtrans() 2632 def Test_synIDtrans()
2521 CheckDefFailure(['synIDtrans("a")'], 'E1013: Argument 1: type mismatch, expected number but got string') 2633 CheckDefFailure(['synIDtrans("a")'], 'E1013: Argument 1: type mismatch, expected number but got string')
2522 enddef 2634 enddef
2523 2635
2636 def Test_synconcealed()
2637 CheckDefAndScriptFailure2(['synconcealed(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
2638 CheckDefAndScriptFailure2(['synconcealed(1, "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2')
2639 enddef
2640
2641 def Test_synstack()
2642 CheckDefAndScriptFailure2(['synstack(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
2643 CheckDefAndScriptFailure2(['synstack(1, "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2')
2644 enddef
2645
2524 def Test_tabpagebuflist() 2646 def Test_tabpagebuflist()
2525 CheckDefFailure(['tabpagebuflist("t")'], 'E1013: Argument 1: type mismatch, expected number but got string') 2647 CheckDefFailure(['tabpagebuflist("t")'], 'E1013: Argument 1: type mismatch, expected number but got string')
2526 assert_equal([bufnr('')], tabpagebuflist()) 2648 assert_equal([bufnr('')], tabpagebuflist())
2527 assert_equal([bufnr('')], tabpagebuflist(1)) 2649 assert_equal([bufnr('')], tabpagebuflist(1))
2528 enddef 2650 enddef
2605 term_gettty(buf, true)->assert_notequal('') 2727 term_gettty(buf, true)->assert_notequal('')
2606 StopShellInTerminal(buf) 2728 StopShellInTerminal(buf)
2607 endif 2729 endif
2608 enddef 2730 enddef
2609 2731
2732 def Test_term_sendkeys()
2733 CheckRunVimInTerminal
2734 CheckDefAndScriptFailure2(['term_sendkeys([], "p")'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 1')
2735 CheckDefAndScriptFailure2(['term_sendkeys(1, [])'], 'E1013: Argument 2: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 2')
2736 enddef
2737
2738 def Test_term_setapi()
2739 CheckRunVimInTerminal
2740 CheckDefAndScriptFailure2(['term_setapi([], "p")'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 1')
2741 CheckDefAndScriptFailure2(['term_setapi(1, [])'], 'E1013: Argument 2: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 2')
2742 enddef
2743
2744 def Test_term_setkill()
2745 CheckRunVimInTerminal
2746 CheckDefAndScriptFailure2(['term_setkill([], "p")'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 1')
2747 CheckDefAndScriptFailure2(['term_setkill(1, [])'], 'E1013: Argument 2: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 2')
2748 enddef
2749
2750 def Test_term_setrestore()
2751 CheckRunVimInTerminal
2752 CheckDefAndScriptFailure2(['term_setrestore([], "p")'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 1')
2753 CheckDefAndScriptFailure2(['term_setrestore(1, [])'], 'E1013: Argument 2: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 2')
2754 enddef
2610 def Test_term_start() 2755 def Test_term_start()
2611 if !has('terminal') 2756 if !has('terminal')
2612 MissingFeature 'terminal' 2757 MissingFeature 'terminal'
2613 else 2758 else
2614 botright new 2759 botright new
2615 var winnr = winnr() 2760 var winnr = winnr()
2616 term_start(&shell, {curwin: true}) 2761 term_start(&shell, {curwin: true})
2617 winnr()->assert_equal(winnr) 2762 winnr()->assert_equal(winnr)
2618 bwipe! 2763 bwipe!
2619 endif 2764 endif
2765 enddef
2766
2767 def Test_term_wait()
2768 CheckRunVimInTerminal
2769 CheckDefAndScriptFailure2(['term_wait(0z10, 1)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E1174: String required for argument 1')
2770 CheckDefAndScriptFailure2(['term_wait(1, "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2')
2620 enddef 2771 enddef
2621 2772
2622 def Test_test_alloc_fail() 2773 def Test_test_alloc_fail()
2623 CheckDefAndScriptFailure2(['test_alloc_fail("a", 10, 20)'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E474: Invalid argument') 2774 CheckDefAndScriptFailure2(['test_alloc_fail("a", 10, 20)'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E474: Invalid argument')
2624 CheckDefAndScriptFailure2(['test_alloc_fail(10, "b", 20)'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E474: Invalid argument') 2775 CheckDefAndScriptFailure2(['test_alloc_fail(10, "b", 20)'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E474: Invalid argument')