comparison src/testdir/test_listdict.vim @ 26638:6fd15d82e898 v8.2.3848

patch 8.2.3848: cannot use reduce() for a string Commit: https://github.com/vim/vim/commit/0ccb5842f5fb103763d106c7aa364d758343c35a Author: rbtnn <naru123456789@gmail.com> Date: Sat Dec 18 18:33:46 2021 +0000 patch 8.2.3848: cannot use reduce() for a string Problem: Cannot use reduce() for a string. Solution: Make reduce() work with a string. (Naruhiko Nishino, closes https://github.com/vim/vim/issues/9366)
author Bram Moolenaar <Bram@vim.org>
date Sat, 18 Dec 2021 19:45:03 +0100
parents 4d18b3a5254a
children 7c055fdd6200
comparison
equal deleted inserted replaced
26637:eeac85e187e7 26638:6fd15d82e898
1 " Tests for the List and Dict types 1 " Tests for the List and Dict types
2 scriptencoding utf-8
2 3
3 source vim9.vim 4 source vim9.vim
4 5
5 func TearDown() 6 func TearDown()
6 " Run garbage collection after every test 7 " Run garbage collection after every test
934 call assert_fails("call sort([1, 2], function('min'), 1)", "E715:") 935 call assert_fails("call sort([1, 2], function('min'), 1)", "E715:")
935 call assert_fails("call sort([1, 2], function('invalid_func'))", "E700:") 936 call assert_fails("call sort([1, 2], function('invalid_func'))", "E700:")
936 call assert_fails("call sort([1, 2], function('min'))", "E118:") 937 call assert_fails("call sort([1, 2], function('min'))", "E118:")
937 endfunc 938 endfunc
938 939
939 " reduce a list or a blob 940 " reduce a list, blob or string
940 func Test_reduce() 941 func Test_reduce()
941 let lines =<< trim END 942 let lines =<< trim END
942 call assert_equal(1, reduce([], LSTART acc, val LMIDDLE acc + val LEND, 1)) 943 call assert_equal(1, reduce([], LSTART acc, val LMIDDLE acc + val LEND, 1))
943 call assert_equal(10, reduce([1, 3, 5], LSTART acc, val LMIDDLE acc + val LEND, 1)) 944 call assert_equal(10, reduce([1, 3, 5], LSTART acc, val LMIDDLE acc + val LEND, 1))
944 call assert_equal(2 * (2 * ((2 * 1) + 2) + 3) + 4, reduce([2, 3, 4], LSTART acc, val LMIDDLE 2 * acc + val LEND, 1)) 945 call assert_equal(2 * (2 * ((2 * 1) + 2) + 3) + 4, reduce([2, 3, 4], LSTART acc, val LMIDDLE 2 * acc + val LEND, 1))
957 call assert_equal(1 + 0xaf + 0xbf + 0xcf, reduce(0zAFBFCF, LSTART acc, val LMIDDLE acc + val LEND, 1)) 958 call assert_equal(1 + 0xaf + 0xbf + 0xcf, reduce(0zAFBFCF, LSTART acc, val LMIDDLE acc + val LEND, 1))
958 call assert_equal(2 * (2 * 1 + 0xaf) + 0xbf, 0zAFBF->reduce(LSTART acc, val LMIDDLE 2 * acc + val LEND, 1)) 959 call assert_equal(2 * (2 * 1 + 0xaf) + 0xbf, 0zAFBF->reduce(LSTART acc, val LMIDDLE 2 * acc + val LEND, 1))
959 960
960 call assert_equal(0xff, reduce(0zff, LSTART acc, val LMIDDLE acc + val LEND)) 961 call assert_equal(0xff, reduce(0zff, LSTART acc, val LMIDDLE acc + val LEND))
961 call assert_equal(2 * (2 * 0xaf + 0xbf) + 0xcf, reduce(0zAFBFCF, LSTART acc, val LMIDDLE 2 * acc + val LEND)) 962 call assert_equal(2 * (2 * 0xaf + 0xbf) + 0xcf, reduce(0zAFBFCF, LSTART acc, val LMIDDLE 2 * acc + val LEND))
963
964 call assert_equal('x,y,z', 'xyz'->reduce(LSTART acc, val LMIDDLE acc .. ',' .. val LEND))
965 call assert_equal('', ''->reduce(LSTART acc, val LMIDDLE acc .. ',' .. val LEND, ''))
966 call assert_equal('あ,い,う,え,お,😊,💕', 'あいうえお😊💕'->reduce(LSTART acc, val LMIDDLE acc .. ',' .. val LEND))
967 call assert_equal('😊,あ,い,う,え,お,💕', 'あいうえお💕'->reduce(LSTART acc, val LMIDDLE acc .. ',' .. val LEND, '😊'))
968 call assert_equal('ऊ,ॠ,ॡ', reduce('ऊॠॡ', LSTART acc, val LMIDDLE acc .. ',' .. val LEND))
969 call assert_equal('c,à,t', reduce('càt', LSTART acc, val LMIDDLE acc .. ',' .. val LEND))
970 call assert_equal('Å,s,t,r,ö,m', reduce('Åström', LSTART acc, val LMIDDLE acc .. ',' .. val LEND))
971 call assert_equal('Å,s,t,r,ö,m', reduce('Åström', LSTART acc, val LMIDDLE acc .. ',' .. val LEND))
972 call assert_equal(',a,b,c', reduce('abc', LSTART acc, val LMIDDLE acc .. ',' .. val LEND, test_null_string()))
962 END 973 END
963 call CheckLegacyAndVim9Success(lines) 974 call CheckLegacyAndVim9Success(lines)
964 975
965 call assert_equal({'x': 1, 'y': 1, 'z': 1 }, ['x', 'y', 'z']->reduce({ acc, val -> extend(acc, { val: 1 }) }, {})) 976 call assert_equal({'x': 1, 'y': 1, 'z': 1 }, ['x', 'y', 'z']->reduce({ acc, val -> extend(acc, { val: 1 }) }, {}))
966 vim9 assert_equal({'x': 1, 'y': 1, 'z': 1 }, ['x', 'y', 'z']->reduce((acc, val) => extend(acc, {[val]: 1 }), {})) 977 vim9 assert_equal({'x': 1, 'y': 1, 'z': 1 }, ['x', 'y', 'z']->reduce((acc, val) => extend(acc, {[val]: 1 }), {}))
967 978
968 call assert_fails("call reduce([], { acc, val -> acc + val })", 'E998: Reduce of an empty List with no initial value') 979 call assert_fails("call reduce([], { acc, val -> acc + val })", 'E998: Reduce of an empty List with no initial value')
969 call assert_fails("call reduce(0z, { acc, val -> acc + val })", 'E998: Reduce of an empty Blob with no initial value') 980 call assert_fails("call reduce(0z, { acc, val -> acc + val })", 'E998: Reduce of an empty Blob with no initial value')
970 981 call assert_fails("call reduce('', { acc, val -> acc + val })", 'E998: Reduce of an empty String with no initial value')
971 call assert_fails("call reduce({}, { acc, val -> acc + val }, 1)", 'E897:') 982 call assert_fails("call reduce(test_null_string(), { acc, val -> acc + val })", 'E998: Reduce of an empty String with no initial value')
972 call assert_fails("call reduce(0, { acc, val -> acc + val }, 1)", 'E897:') 983
973 call assert_fails("call reduce('', { acc, val -> acc + val }, 1)", 'E897:') 984 call assert_fails("call reduce({}, { acc, val -> acc + val }, 1)", 'E1098:')
985 call assert_fails("call reduce(0, { acc, val -> acc + val }, 1)", 'E1098:')
974 call assert_fails("call reduce([1, 2], 'Xdoes_not_exist')", 'E117:') 986 call assert_fails("call reduce([1, 2], 'Xdoes_not_exist')", 'E117:')
975 call assert_fails("echo reduce(0z01, { acc, val -> 2 * acc + val }, '')", 'E39:') 987 call assert_fails("echo reduce(0z01, { acc, val -> 2 * acc + val }, '')", 'E39:')
988
989 call assert_fails("vim9 reduce(0, (acc, val) => (acc .. val), '')", 'E1252:')
990 call assert_fails("vim9 reduce({}, (acc, val) => (acc .. val), '')", 'E1252:')
991 call assert_fails("vim9 reduce(0.1, (acc, val) => (acc .. val), '')", 'E1252:')
992 call assert_fails("vim9 reduce(function('tr'), (acc, val) => (acc .. val), '')", 'E1252:')
993 call assert_fails("call reduce('', { acc, val -> acc + val }, 1)", 'E1253:')
994 call assert_fails("call reduce('', { acc, val -> acc + val }, {})", 'E1253:')
995 call assert_fails("call reduce('', { acc, val -> acc + val }, 0.1)", 'E1253:')
996 call assert_fails("call reduce('', { acc, val -> acc + val }, function('tr'))", 'E1253:')
976 997
977 let g:lut = [1, 2, 3, 4] 998 let g:lut = [1, 2, 3, 4]
978 func EvilRemove() 999 func EvilRemove()
979 call remove(g:lut, 1) 1000 call remove(g:lut, 1)
980 return 1 1001 return 1