comparison src/testdir/test_vim9_builtin.vim @ 30588:56fabd53c7b8 v9.0.0629

patch 9.0.0629: get an error for using const only when executing Commit: https://github.com/vim/vim/commit/a5d1a67bee5672786c4b172f66ae4391e7b0cc57 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Sep 30 17:57:47 2022 +0100 patch 9.0.0629: get an error for using const only when executing Problem: Get an error for using const only when executing. Solution: Check for const at compile time for filter(), map(), remove(), reverse(), sort() and uniq().
author Bram Moolenaar <Bram@vim.org>
date Fri, 30 Sep 2022 19:00:05 +0200
parents ee039a6049ff
children 9f37bcd4d5c5
comparison
equal deleted inserted replaced
30587:8b4040d04c32 30588:56fabd53c7b8
1526 var dict = {aa: [1], ab: [2], ac: [3], de: [4]} 1526 var dict = {aa: [1], ab: [2], ac: [3], de: [4]}
1527 var res = dict->filter((k, _) => k =~ 'a' && k !~ 'b') 1527 var res = dict->filter((k, _) => k =~ 'a' && k !~ 'b')
1528 res->assert_equal({aa: [1], ac: [3]}) 1528 res->assert_equal({aa: [1], ac: [3]})
1529 enddef 1529 enddef
1530 1530
1531 def Test_filter_const()
1532 var lines =<< trim END
1533 const l = [1, 2, 3]
1534 filter(l, 'v:val == 2')
1535 END
1536 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const list<number>')
1537
1538 lines =<< trim END
1539 const d = {a: 1, b: 2}
1540 filter(d, 'v:val == 2')
1541 END
1542 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const dict<number>')
1543 enddef
1544
1531 def Test_foldclosed() 1545 def Test_foldclosed()
1532 v9.CheckDefAndScriptFailure(['foldclosed(function("min"))'], ['E1013: Argument 1: type mismatch, expected string but got func(...): unknown', 'E1220: String or Number required for argument 1']) 1546 v9.CheckDefAndScriptFailure(['foldclosed(function("min"))'], ['E1013: Argument 1: type mismatch, expected string but got func(...): unknown', 'E1220: String or Number required for argument 1'])
1533 v9.CheckDefExecAndScriptFailure(['foldclosed("")'], 'E1209: Invalid value for a line number') 1547 v9.CheckDefExecAndScriptFailure(['foldclosed("")'], 'E1209: Invalid value for a line number')
1534 assert_equal(-1, foldclosed(1)) 1548 assert_equal(-1, foldclosed(1))
1535 assert_equal(-1, foldclosed('$')) 1549 assert_equal(-1, foldclosed('$'))
2543 var d: dict<number> = {a: 1} 2557 var d: dict<number> = {a: 1}
2544 g:gd = d 2558 g:gd = d
2545 map(g:gd, (k, v) => true) 2559 map(g:gd, (k, v) => true)
2546 END 2560 END
2547 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got bool') 2561 v9.CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got bool')
2562 enddef
2563
2564 def Test_map_const()
2565 var lines =<< trim END
2566 const l = [1, 2, 3]
2567 map(l, 'SomeFunc')
2568 END
2569 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const list<number>')
2570
2571 lines =<< trim END
2572 const d = {a: 1, b: 2}
2573 map(d, 'SomeFunc')
2574 END
2575 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const dict<number>')
2548 enddef 2576 enddef
2549 2577
2550 def Test_map_function_arg() 2578 def Test_map_function_arg()
2551 var lines =<< trim END 2579 var lines =<< trim END
2552 def MapOne(i: number, v: string): string 2580 def MapOne(i: number, v: string): string
3332 CheckFeature clientserver 3360 CheckFeature clientserver
3333 CheckEnv DISPLAY 3361 CheckEnv DISPLAY
3334 v9.CheckDefAndScriptFailure(['remote_startserver({})'], ['E1013: Argument 1: type mismatch, expected string but got dict<unknown>', 'E1174: String required for argument 1']) 3362 v9.CheckDefAndScriptFailure(['remote_startserver({})'], ['E1013: Argument 1: type mismatch, expected string but got dict<unknown>', 'E1174: String required for argument 1'])
3335 enddef 3363 enddef
3336 3364
3337 def Test_remove_const_list() 3365 def Test_remove_literal_list()
3338 var l: list<number> = [1, 2, 3, 4] 3366 var l: list<number> = [1, 2, 3, 4]
3339 assert_equal([1, 2], remove(l, 0, 1)) 3367 assert_equal([1, 2], remove(l, 0, 1))
3340 assert_equal([3, 4], l) 3368 assert_equal([3, 4], l)
3369 enddef
3370
3371 def Test_remove_const()
3372 var lines =<< trim END
3373 const l = [1, 2, 3, 4]
3374 remove(l, 1)
3375 END
3376 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const list<number>')
3377
3378 lines =<< trim END
3379 const d = {a: 1, b: 2}
3380 remove(d, 'a')
3381 END
3382 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const dict<number>')
3383
3384 lines =<< trim END
3385 const b = 0z010203
3386 remove(b, 1)
3387 END
3388 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const blob')
3341 enddef 3389 enddef
3342 3390
3343 def Test_remove() 3391 def Test_remove()
3344 v9.CheckDefAndScriptFailure(['remove("a", 1)'], ['E1013: Argument 1: type mismatch, expected list<any> but got string', 'E1228: List, Dictionary or Blob required for argument 1']) 3392 v9.CheckDefAndScriptFailure(['remove("a", 1)'], ['E1013: Argument 1: type mismatch, expected list<any> but got string', 'E1228: List, Dictionary or Blob required for argument 1'])
3345 v9.CheckDefAndScriptFailure(['remove([], "b")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2']) 3393 v9.CheckDefAndScriptFailure(['remove([], "b")'], ['E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2'])
3417 res += n 3465 res += n
3418 endfor 3466 endfor
3419 res->assert_equal(6) 3467 res->assert_equal(6)
3420 enddef 3468 enddef
3421 3469
3470 def Test_reverse_const()
3471 var lines =<< trim END
3472 const l = [1, 2, 3, 4]
3473 reverse(l)
3474 END
3475 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const list<number>')
3476
3477 lines =<< trim END
3478 const b = 0z010203
3479 reverse(b)
3480 END
3481 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const blob')
3482 enddef
3483
3422 def Test_rubyeval() 3484 def Test_rubyeval()
3423 if !has('ruby') 3485 if !has('ruby')
3424 CheckFeature ruby 3486 CheckFeature ruby
3425 endif 3487 endif
3426 v9.CheckDefAndScriptFailure(['rubyeval([2])'], ['E1013: Argument 1: type mismatch, expected string but got list<number>', 'E1174: String required for argument 1']) 3488 v9.CheckDefAndScriptFailure(['rubyeval([2])'], ['E1013: Argument 1: type mismatch, expected string but got list<number>', 'E1174: String required for argument 1'])
4051 SortedList()->assert_equal([1, 2, 3]) 4113 SortedList()->assert_equal([1, 2, 3])
4052 END 4114 END
4053 v9.CheckScriptSuccess(lines) 4115 v9.CheckScriptSuccess(lines)
4054 enddef 4116 enddef
4055 4117
4118 def Test_sort_const()
4119 var lines =<< trim END
4120 const l = [1, 2, 3, 4]
4121 sort(l)
4122 END
4123 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const list<number>')
4124 enddef
4125
4056 def Test_sort_compare_func_fails() 4126 def Test_sort_compare_func_fails()
4057 v9.CheckDefAndScriptFailure(['sort("a")'], ['E1013: Argument 1: type mismatch, expected list<any> but got string', 'E1211: List required for argument 1']) 4127 v9.CheckDefAndScriptFailure(['sort("a")'], ['E1013: Argument 1: type mismatch, expected list<any> but got string', 'E1211: List required for argument 1'])
4058 v9.CheckDefAndScriptFailure(['sort([1], "", [1])'], ['E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3']) 4128 v9.CheckDefAndScriptFailure(['sort([1], "", [1])'], ['E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3'])
4059 4129
4060 var lines =<< trim END 4130 var lines =<< trim END
4650 def Test_uniq() 4720 def Test_uniq()
4651 v9.CheckDefAndScriptFailure(['uniq("a")'], ['E1013: Argument 1: type mismatch, expected list<any> but got string', 'E1211: List required for argument 1']) 4721 v9.CheckDefAndScriptFailure(['uniq("a")'], ['E1013: Argument 1: type mismatch, expected list<any> but got string', 'E1211: List required for argument 1'])
4652 v9.CheckDefAndScriptFailure(['uniq([1], "", [1])'], ['E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3']) 4722 v9.CheckDefAndScriptFailure(['uniq([1], "", [1])'], ['E1013: Argument 3: type mismatch, expected dict<any> but got list<number>', 'E1206: Dictionary required for argument 3'])
4653 4723
4654 v9.CheckDefFailure(['var l: list<number> = uniq(["a", "b"])'], 'E1012: Type mismatch; expected list<number> but got list<string>') 4724 v9.CheckDefFailure(['var l: list<number> = uniq(["a", "b"])'], 'E1012: Type mismatch; expected list<number> but got list<string>')
4725 enddef
4726
4727 def Test_uniq_const()
4728 var lines =<< trim END
4729 const l = [1, 2, 3, 4]
4730 uniq(l)
4731 END
4732 v9.CheckDefFailure(lines, 'E1307: Argument 1: Trying to modify a const list<number>')
4655 enddef 4733 enddef
4656 4734
4657 def Test_values() 4735 def Test_values()
4658 v9.CheckDefAndScriptFailure(['values([])'], ['E1013: Argument 1: type mismatch, expected dict<any> but got list<unknown>', 'E1206: Dictionary required for argument 1']) 4736 v9.CheckDefAndScriptFailure(['values([])'], ['E1013: Argument 1: type mismatch, expected dict<any> but got list<unknown>', 'E1206: Dictionary required for argument 1'])
4659 assert_equal([], {}->values()) 4737 assert_equal([], {}->values())