Mercurial > vim
comparison src/testdir/test_vim9_builtin.vim @ 25356:1cde96e768e4 v8.2.3215
patch 8.2.3215: Vim9: argument types are not checked at compile time
Commit: https://github.com/vim/vim/commit/5bca906b307728fa74a112914dc55b424d512d39
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Sat Jul 24 21:33:26 2021 +0200
patch 8.2.3215: Vim9: argument types are not checked at compile time
Problem: Vim9: argument types are not checked at compile time.
Solution: Add several more type checks. Sort the argument lists.
(Yegappan Lakshmanan, closes #8626)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 24 Jul 2021 21:45:04 +0200 |
parents | 75031a22be39 |
children | 53340635776e |
comparison
equal
deleted
inserted
replaced
25355:efef27c0f8a0 | 25356:1cde96e768e4 |
---|---|
371 | 371 |
372 def Test_call_call() | 372 def Test_call_call() |
373 var l = [3, 2, 1] | 373 var l = [3, 2, 1] |
374 call('reverse', [l]) | 374 call('reverse', [l]) |
375 l->assert_equal([1, 2, 3]) | 375 l->assert_equal([1, 2, 3]) |
376 CheckDefAndScriptFailure2(['call("reverse", 2)'], 'E1013: Argument 2: type mismatch, expected list<any> but got number', 'E1211: List required for argument 2') | |
377 CheckDefAndScriptFailure2(['call("reverse", [2], [1])'], 'E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3') | |
376 enddef | 378 enddef |
377 | 379 |
378 def Test_ch_canread() | 380 def Test_ch_canread() |
379 if !has('channel') | 381 if !has('channel') |
380 CheckFeature channel | 382 CheckFeature channel |
1124 assert_equal('srewind', fullcommand('sre')) | 1126 assert_equal('srewind', fullcommand('sre')) |
1125 assert_equal('scriptnames', fullcommand('scr')) | 1127 assert_equal('scriptnames', fullcommand('scr')) |
1126 assert_equal('', fullcommand('scg')) | 1128 assert_equal('', fullcommand('scg')) |
1127 enddef | 1129 enddef |
1128 | 1130 |
1131 def Test_funcref() | |
1132 CheckDefAndScriptFailure2(['funcref("reverse", 2)'], 'E1013: Argument 2: type mismatch, expected list<any> but got number', 'E1211: List required for argument 2') | |
1133 CheckDefAndScriptFailure2(['funcref("reverse", [2], [1])'], 'E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3') | |
1134 enddef | |
1135 | |
1136 def Test_function() | |
1137 CheckDefAndScriptFailure2(['function("reverse", 2)'], 'E1013: Argument 2: type mismatch, expected list<any> but got number', 'E1211: List required for argument 2') | |
1138 CheckDefAndScriptFailure2(['function("reverse", [2], [1])'], 'E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3') | |
1139 enddef | |
1140 | |
1129 def Test_garbagecollect() | 1141 def Test_garbagecollect() |
1130 garbagecollect(true) | 1142 garbagecollect(true) |
1131 CheckDefAndScriptFailure2(['garbagecollect("1")'], 'E1013: Argument 1: type mismatch, expected bool but got string', 'E1135: Using a String as a Bool') | 1143 CheckDefAndScriptFailure2(['garbagecollect("1")'], 'E1013: Argument 1: type mismatch, expected bool but got string', 'E1135: Using a String as a Bool') |
1132 CheckDefAndScriptFailure2(['garbagecollect(20)'], 'E1013: Argument 1: type mismatch, expected bool but got number', 'E1023: Using a Number as a Bool') | 1144 CheckDefAndScriptFailure2(['garbagecollect(20)'], 'E1013: Argument 1: type mismatch, expected bool but got number', 'E1023: Using a Number as a Bool') |
1133 enddef | 1145 enddef |
1689 def Test_keys_return_type() | 1701 def Test_keys_return_type() |
1690 const var: list<string> = {a: 1, b: 2}->keys() | 1702 const var: list<string> = {a: 1, b: 2}->keys() |
1691 var->assert_equal(['a', 'b']) | 1703 var->assert_equal(['a', 'b']) |
1692 enddef | 1704 enddef |
1693 | 1705 |
1706 def Test_libcall() | |
1707 CheckFeature libcall | |
1708 CheckDefAndScriptFailure2(['libcall(1, "b", 3)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | |
1709 CheckDefAndScriptFailure2(['libcall("a", 2, 3)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') | |
1710 CheckDefAndScriptFailure2(['libcall("a", "b", 1.1)'], 'E1013: Argument 3: type mismatch, expected string but got float', 'E1174: String required for argument 3') | |
1711 enddef | |
1712 | |
1713 def Test_libcallnr() | |
1714 CheckFeature libcall | |
1715 CheckDefAndScriptFailure2(['libcallnr(1, "b", 3)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | |
1716 CheckDefAndScriptFailure2(['libcallnr("a", 2, 3)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') | |
1717 CheckDefAndScriptFailure2(['libcallnr("a", "b", 1.1)'], 'E1013: Argument 3: type mismatch, expected string but got float', 'E1174: String required for argument 3') | |
1718 enddef | |
1719 | |
1694 def Test_line() | 1720 def Test_line() |
1695 assert_fails('line(true)', 'E1174:') | 1721 assert_fails('line(true)', 'E1174:') |
1696 CheckDefAndScriptFailure2(['line(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | 1722 CheckDefAndScriptFailure2(['line(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') |
1697 CheckDefAndScriptFailure2(['line(".", "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') | 1723 CheckDefAndScriptFailure2(['line(".", "a")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') |
1698 enddef | 1724 enddef |
1722 | 1748 |
1723 def SID(): number | 1749 def SID(): number |
1724 return expand('<SID>') | 1750 return expand('<SID>') |
1725 ->matchstr('<SNR>\zs\d\+\ze_$') | 1751 ->matchstr('<SNR>\zs\d\+\ze_$') |
1726 ->str2nr() | 1752 ->str2nr() |
1753 enddef | |
1754 | |
1755 def Test_listener_add() | |
1756 CheckDefAndScriptFailure2(['listener_add("1", true)'], 'E1013: Argument 2: type mismatch, expected string but got bool', 'E1174: String required for argument 2') | |
1727 enddef | 1757 enddef |
1728 | 1758 |
1729 def Test_listener_flush() | 1759 def Test_listener_flush() |
1730 CheckDefAndScriptFailure2(['listener_flush([1])'], 'E1013: Argument 1: type mismatch, expected string but got list<number>', 'E730: Using a List as a String') | 1760 CheckDefAndScriptFailure2(['listener_flush([1])'], 'E1013: Argument 1: type mismatch, expected string but got list<number>', 'E730: Using a List as a String') |
1731 enddef | 1761 enddef |
2283 CheckDefAndScriptFailure2(['range(10, "b")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1030: Using a String as a Number') | 2313 CheckDefAndScriptFailure2(['range(10, "b")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1030: Using a String as a Number') |
2284 CheckDefAndScriptFailure2(['range(10, 20, "c")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1030: Using a String as a Number') | 2314 CheckDefAndScriptFailure2(['range(10, 20, "c")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1030: Using a String as a Number') |
2285 enddef | 2315 enddef |
2286 | 2316 |
2287 def Test_readdir() | 2317 def Test_readdir() |
2288 eval expand('sautest')->readdir((e) => e[0] !=# '.') | 2318 eval expand('sautest')->readdir((e) => e[0] !=# '.') |
2289 eval expand('sautest')->readdirex((e) => e.name[0] !=# '.') | 2319 eval expand('sautest')->readdirex((e) => e.name[0] !=# '.') |
2320 CheckDefAndScriptFailure2(['readdir(["a"])'], 'E1013: Argument 1: type mismatch, expected string but got list<string>', 'E1174: String required for argument 1') | |
2321 CheckDefAndScriptFailure2(['readdir("a", "1", [3])'], 'E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3') | |
2322 enddef | |
2323 | |
2324 def Test_readdirex() | |
2325 CheckDefAndScriptFailure2(['readdirex(["a"])'], 'E1013: Argument 1: type mismatch, expected string but got list<string>', 'E1174: String required for argument 1') | |
2326 CheckDefAndScriptFailure2(['readdirex("a", "1", [3])'], 'E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3') | |
2290 enddef | 2327 enddef |
2291 | 2328 |
2292 def Test_readblob() | 2329 def Test_readblob() |
2293 var blob = 0z12341234 | 2330 var blob = 0z12341234 |
2294 writefile(blob, 'Xreadblob') | 2331 writefile(blob, 'Xreadblob') |
2602 Fail() | 2639 Fail() |
2603 END | 2640 END |
2604 CheckScriptSuccess(lines) | 2641 CheckScriptSuccess(lines) |
2605 assert_equal('yes', g:caught) | 2642 assert_equal('yes', g:caught) |
2606 unlet g:caught | 2643 unlet g:caught |
2644 bwipe! | |
2607 | 2645 |
2608 lines =<< trim END | 2646 lines =<< trim END |
2609 echo searchpair("a", "b", "c", "d", "f", 33) | 2647 echo searchpair("a", "b", "c", "d", "f", 33) |
2610 END | 2648 END |
2611 CheckDefAndScriptFailure2(lines, 'E1001: Variable not found: f', 'E475: Invalid argument: d') | 2649 CheckDefAndScriptFailure2(lines, 'E1001: Variable not found: f', 'E475: Invalid argument: d') |
2612 | 2650 |
2613 lines =<< trim END | |
2614 def TestPair() | |
2615 echo searchpair("a", "b", "c", "d", "1", 99) | |
2616 enddef | |
2617 defcompile | |
2618 END | |
2619 CheckScriptSuccess(lines) | |
2620 | |
2621 bwipe! | |
2622 CheckDefAndScriptFailure2(['searchpair(1, "b", "c")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | 2651 CheckDefAndScriptFailure2(['searchpair(1, "b", "c")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') |
2623 CheckDefAndScriptFailure2(['searchpair("a", 2, "c")'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') | 2652 CheckDefAndScriptFailure2(['searchpair("a", 2, "c")'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') |
2624 CheckDefAndScriptFailure2(['searchpair("a", "b", 3)'], 'E1013: Argument 3: type mismatch, expected string but got number', 'E1174: String required for argument 3') | 2653 CheckDefAndScriptFailure2(['searchpair("a", "b", 3)'], 'E1013: Argument 3: type mismatch, expected string but got number', 'E1174: String required for argument 3') |
2625 CheckDefAndScriptFailure2(['searchpair("a", "b", "c", 4)'], 'E1013: Argument 4: type mismatch, expected string but got number', 'E1174: String required for argument 4') | 2654 CheckDefAndScriptFailure2(['searchpair("a", "b", "c", 4)'], 'E1013: Argument 4: type mismatch, expected string but got number', 'E1174: String required for argument 4') |
2626 # BUG: Vim crashes with the following test | 2655 CheckDefAndScriptFailure2(['searchpair("a", "b", "c", "r", "1", "f")'], 'E1013: Argument 6: type mismatch, expected number but got string', 'E1210: Number required for argument 6') |
2627 #CheckDefAndScriptFailure2(['searchpair("a", "b", "c", "d", "1", "f")'], 'E1013: Argument 4: type mismatch, expected string but got number', 'E1174: String required for argument 4') | 2656 CheckDefAndScriptFailure2(['searchpair("a", "b", "c", "r", "1", 3, "g")'], 'E1013: Argument 7: type mismatch, expected number but got string', 'E1210: Number required for argument 7') |
2628 #CheckDefAndScriptFailure2(['searchpair("a", "b", "c", "d", "1", 3, "g")'], 'E1013: Argument 4: type mismatch, expected string but got number', 'E1174: String required for argument 4') | |
2629 enddef | 2657 enddef |
2630 | 2658 |
2631 def Test_searchpos() | 2659 def Test_searchpos() |
2632 CheckDefAndScriptFailure2(['searchpos(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | 2660 CheckDefAndScriptFailure2(['searchpos(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') |
2633 CheckDefAndScriptFailure2(['searchpos("a", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') | 2661 CheckDefAndScriptFailure2(['searchpos("a", 2)'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') |
2949 CheckDefAndScriptFailure2(['spellsuggest(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | 2977 CheckDefAndScriptFailure2(['spellsuggest(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') |
2950 CheckDefAndScriptFailure2(['spellsuggest("a", "b")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') | 2978 CheckDefAndScriptFailure2(['spellsuggest("a", "b")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') |
2951 CheckDefAndScriptFailure2(['spellsuggest("a", 1, 0z01)'], 'E1013: Argument 3: type mismatch, expected bool but got blob', 'E1212: Bool required for argument 3') | 2979 CheckDefAndScriptFailure2(['spellsuggest("a", 1, 0z01)'], 'E1013: Argument 3: type mismatch, expected bool but got blob', 'E1212: Bool required for argument 3') |
2952 enddef | 2980 enddef |
2953 | 2981 |
2982 def Test_sound_playevent() | |
2983 CheckFeature sound | |
2984 CheckDefAndScriptFailure2(['sound_playevent(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | |
2985 enddef | |
2986 | |
2987 def Test_sound_playfile() | |
2988 CheckFeature sound | |
2989 CheckDefAndScriptFailure2(['sound_playfile(1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | |
2990 enddef | |
2991 | |
2954 def Test_sound_stop() | 2992 def Test_sound_stop() |
2955 CheckFeature sound | 2993 CheckFeature sound |
2956 CheckDefFailure(['sound_stop("x")'], 'E1013: Argument 1: type mismatch, expected number but got string') | 2994 CheckDefFailure(['sound_stop("x")'], 'E1013: Argument 1: type mismatch, expected number but got string') |
2957 enddef | 2995 enddef |
2958 | 2996 |
3135 | 3173 |
3136 if has('job') | 3174 if has('job') |
3137 assert_fails('"text"->substitute(".*", () => job_start(":"), "")', 'E908: using an invalid value as a String: job') | 3175 assert_fails('"text"->substitute(".*", () => job_start(":"), "")', 'E908: using an invalid value as a String: job') |
3138 assert_fails('"text"->substitute(".*", () => job_start(":")->job_getchannel(), "")', 'E908: using an invalid value as a String: channel') | 3176 assert_fails('"text"->substitute(".*", () => job_start(":")->job_getchannel(), "")', 'E908: using an invalid value as a String: channel') |
3139 endif | 3177 endif |
3178 CheckDefAndScriptFailure2(['substitute(1, "b", "1", "d")'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | |
3179 CheckDefAndScriptFailure2(['substitute("a", 2, "1", "d")'], 'E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2') | |
3180 CheckDefAndScriptFailure2(['substitute("a", "b", "1", 4)'], 'E1013: Argument 4: type mismatch, expected string but got number', 'E1174: String required for argument 4') | |
3140 enddef | 3181 enddef |
3141 | 3182 |
3142 def Test_swapinfo() | 3183 def Test_swapinfo() |
3143 CheckDefFailure(['swapinfo({})'], 'E1013: Argument 1: type mismatch, expected string but got dict<unknown>') | 3184 CheckDefFailure(['swapinfo({})'], 'E1013: Argument 1: type mismatch, expected string but got dict<unknown>') |
3144 call assert_equal({error: 'Cannot open file'}, swapinfo('x')) | 3185 call assert_equal({error: 'Cannot open file'}, swapinfo('x')) |
3374 | 3415 |
3375 def Test_test_getvalue() | 3416 def Test_test_getvalue() |
3376 CheckDefAndScriptFailure2(['test_getvalue(1.1)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E474: Invalid argument') | 3417 CheckDefAndScriptFailure2(['test_getvalue(1.1)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E474: Invalid argument') |
3377 enddef | 3418 enddef |
3378 | 3419 |
3420 def Test_test_gui_drop_files() | |
3421 CheckGui | |
3422 CheckDefAndScriptFailure2(['test_gui_drop_files("a", 1, 1, 0)'], 'E1013: Argument 1: type mismatch, expected list<string> but got string', 'E1211: List required for argument 1') | |
3423 CheckDefAndScriptFailure2(['test_gui_drop_files(["x"], "", 1, 0)'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') | |
3424 CheckDefAndScriptFailure2(['test_gui_drop_files(["x"], 1, "", 0)'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3') | |
3425 CheckDefAndScriptFailure2(['test_gui_drop_files(["x"], 1, 1, "")'], 'E1013: Argument 4: type mismatch, expected number but got string', 'E1210: Number required for argument 4') | |
3426 enddef | |
3427 | |
3379 def Test_test_gui_mouse_event() | 3428 def Test_test_gui_mouse_event() |
3380 CheckGui | 3429 CheckGui |
3381 CheckDefAndScriptFailure2(['test_gui_mouse_event(1.1, 1, 1, 1, 1)'], 'E1013: Argument 1: type mismatch, expected number but got float', 'E1210: Number required for argument 1') | 3430 CheckDefAndScriptFailure2(['test_gui_mouse_event(1.1, 1, 1, 1, 1)'], 'E1013: Argument 1: type mismatch, expected number but got float', 'E1210: Number required for argument 1') |
3382 CheckDefAndScriptFailure2(['test_gui_mouse_event(1, "1", 1, 1, 1)'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') | 3431 CheckDefAndScriptFailure2(['test_gui_mouse_event(1, "1", 1, 1, 1)'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') |
3383 CheckDefAndScriptFailure2(['test_gui_mouse_event(1, 1, "1", 1, 1)'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3') | 3432 CheckDefAndScriptFailure2(['test_gui_mouse_event(1, 1, "1", 1, 1)'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3') |
3395 enddef | 3444 enddef |
3396 | 3445 |
3397 def Test_test_override() | 3446 def Test_test_override() |
3398 CheckDefAndScriptFailure2(['test_override(1, 1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | 3447 CheckDefAndScriptFailure2(['test_override(1, 1)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') |
3399 CheckDefAndScriptFailure2(['test_override("a", "x")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') | 3448 CheckDefAndScriptFailure2(['test_override("a", "x")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') |
3449 enddef | |
3450 | |
3451 def Test_test_scrollbar() | |
3452 CheckGui | |
3453 CheckDefAndScriptFailure2(['test_scrollbar(1, 2, 3)'], 'E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1') | |
3454 CheckDefAndScriptFailure2(['test_scrollbar("a", "b", 3)'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2') | |
3455 CheckDefAndScriptFailure2(['test_scrollbar("a", 2, "c")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3') | |
3400 enddef | 3456 enddef |
3401 | 3457 |
3402 def Test_test_setmouse() | 3458 def Test_test_setmouse() |
3403 CheckDefAndScriptFailure2(['test_setmouse("a", 10)'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E474: Invalid argument') | 3459 CheckDefAndScriptFailure2(['test_setmouse("a", 10)'], 'E1013: Argument 1: type mismatch, expected number but got string', 'E474: Invalid argument') |
3404 CheckDefAndScriptFailure2(['test_setmouse(10, "b")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E474: Invalid argument') | 3460 CheckDefAndScriptFailure2(['test_setmouse(10, "b")'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E474: Invalid argument') |