To: vim_dev@googlegroups.com Subject: Patch 8.2.2782 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.2782 Problem: Vim9: blob operations not fully tested. Solution: Make more blob tests run in Vim9 script. Fix filter(). Make insert() give an error for a null blob, like add(). Files: src/list.c, src/testdir/test_blob.vim, src/testdir/test_vim9_builtin.vim *** ../vim-8.2.2781/src/list.c 2021-04-18 14:12:27.707697058 +0200 --- src/list.c 2021-04-18 15:37:41.323438243 +0200 *************** *** 2223,2229 **** if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL || did_emsg) break; ! if (newtv.v_type != VAR_NUMBER) { clear_tv(&newtv); emsg(_(e_invalblob)); --- 2223,2229 ---- if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL || did_emsg) break; ! if (newtv.v_type != VAR_NUMBER && newtv.v_type != VAR_BOOL) { clear_tv(&newtv); emsg(_(e_invalblob)); *************** *** 2736,2742 **** { long before = 0; listitem_T *item; - list_T *l; int error = FALSE; if (argvars[0].v_type == VAR_BLOB) --- 2736,2741 ---- *************** *** 2745,2751 **** --- 2744,2754 ---- char_u *p; if (argvars[0].vval.v_blob == NULL) + { + if (in_vim9script()) + emsg(_(e_cannot_add_to_null_blob)); return; + } len = blob_len(argvars[0].vval.v_blob); if (argvars[2].v_type != VAR_UNKNOWN) *************** *** 2779,2808 **** } else if (argvars[0].v_type != VAR_LIST) semsg(_(e_listblobarg), "insert()"); ! else if ((l = argvars[0].vval.v_list) != NULL ! && !value_check_lock(l->lv_lock, ! (char_u *)N_("insert() argument"), TRUE)) { ! if (argvars[2].v_type != VAR_UNKNOWN) ! before = (long)tv_get_number_chk(&argvars[2], &error); ! if (error) ! return; // type error; errmsg already given ! if (before == l->lv_len) ! item = NULL; ! else { ! item = list_find(l, before); ! if (item == NULL) ! { ! semsg(_(e_listidx), before); ! l = NULL; ! } } ! if (l != NULL) { ! (void)list_insert_tv(l, &argvars[1], item); ! copy_tv(&argvars[0], rettv); } } } --- 2782,2820 ---- } else if (argvars[0].v_type != VAR_LIST) semsg(_(e_listblobarg), "insert()"); ! else { ! list_T *l = argvars[0].vval.v_list; ! if (l == NULL) { ! if (in_vim9script()) ! emsg(_(e_cannot_add_to_null_list)); } ! else if (!value_check_lock(l->lv_lock, ! (char_u *)N_("insert() argument"), TRUE)) { ! if (argvars[2].v_type != VAR_UNKNOWN) ! before = (long)tv_get_number_chk(&argvars[2], &error); ! if (error) ! return; // type error; errmsg already given ! ! if (before == l->lv_len) ! item = NULL; ! else ! { ! item = list_find(l, before); ! if (item == NULL) ! { ! semsg(_(e_listidx), before); ! l = NULL; ! } ! } ! if (l != NULL) ! { ! (void)list_insert_tv(l, &argvars[1], item); ! copy_tv(&argvars[0], rettv); ! } } } } *** ../vim-8.2.2781/src/testdir/test_blob.vim 2021-04-18 14:12:27.707697058 +0200 --- src/testdir/test_blob.vim 2021-04-18 15:39:15.674557872 +0200 *************** *** 379,423 **** " Test removing items in blob func Test_blob_func_remove() ! " Test removing 1 element ! let b = 0zDEADBEEF ! call assert_equal(0xDE, remove(b, 0)) ! call assert_equal(0zADBEEF, b) ! ! let b = 0zDEADBEEF ! call assert_equal(0xEF, remove(b, -1)) ! call assert_equal(0zDEADBE, b) ! ! let b = 0zDEADBEEF ! call assert_equal(0xAD, remove(b, 1)) ! call assert_equal(0zDEBEEF, b) ! ! " Test removing range of element(s) ! let b = 0zDEADBEEF ! call assert_equal(0zBE, remove(b, 2, 2)) ! call assert_equal(0zDEADEF, b) ! ! let b = 0zDEADBEEF ! call assert_equal(0zADBE, remove(b, 1, 2)) ! call assert_equal(0zDEEF, b) " Test invalid cases ! let b = 0zDEADBEEF ! call assert_fails("call remove(b, 5)", 'E979:') ! call assert_fails("call remove(b, 1, 5)", 'E979:') ! call assert_fails("call remove(b, 3, 2)", 'E979:') ! call assert_fails("call remove(1, 0)", 'E896:') ! call assert_fails("call remove(b, b)", 'E974:') ! call assert_fails("call remove(b, 1, [])", 'E745:') ! call assert_fails("call remove(test_null_blob(), 1, 2)", 'E979:') endfunc func Test_blob_read_write() ! let b = 0zDEADBEEF ! call writefile(b, 'Xblob') ! let br = readfile('Xblob', 'B') ! call assert_equal(b, br) ! call delete('Xblob') " This was crashing when calling readfile() with a directory. call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory') --- 379,462 ---- " Test removing items in blob func Test_blob_func_remove() ! let lines =<< trim END ! #" Test removing 1 element ! VAR b = 0zDEADBEEF ! call assert_equal(0xDE, remove(b, 0)) ! call assert_equal(0zADBEEF, b) ! ! LET b = 0zDEADBEEF ! call assert_equal(0xEF, remove(b, -1)) ! call assert_equal(0zDEADBE, b) ! ! LET b = 0zDEADBEEF ! call assert_equal(0xAD, remove(b, 1)) ! call assert_equal(0zDEBEEF, b) ! ! #" Test removing range of element(s) ! LET b = 0zDEADBEEF ! call assert_equal(0zBE, remove(b, 2, 2)) ! call assert_equal(0zDEADEF, b) ! ! LET b = 0zDEADBEEF ! call assert_equal(0zADBE, remove(b, 1, 2)) ! call assert_equal(0zDEEF, b) ! END ! call CheckLegacyAndVim9Success(lines) " Test invalid cases ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call remove(b, 5) ! END ! call CheckLegacyAndVim9Failure(lines, 'E979:') ! ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call remove(b, 1, 5) ! END ! call CheckLegacyAndVim9Failure(lines, 'E979:') ! ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call remove(b, 3, 2) ! END ! call CheckLegacyAndVim9Failure(lines, 'E979:') ! ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call remove(1, 0) ! END ! call CheckLegacyAndVim9Failure(lines, 'E896:') ! ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call remove(b, b) ! END ! call CheckLegacyAndVim9Failure(lines, 'E974:') ! ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call remove(b, 1, []) ! END ! call CheckLegacyAndVim9Failure(lines, 'E745:') ! ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call remove(test_null_blob(), 1, 2) ! END ! call CheckLegacyAndVim9Failure(lines, 'E979:') endfunc func Test_blob_read_write() ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call writefile(b, 'Xblob') ! VAR br = readfile('Xblob', 'B') ! call assert_equal(b, br) ! call delete('Xblob') ! END ! call CheckLegacyAndVim9Success(lines) " This was crashing when calling readfile() with a directory. call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory') *************** *** 425,508 **** " filter() item in blob func Test_blob_filter() ! call assert_equal(test_null_blob(), filter(test_null_blob(), '0')) ! call assert_equal(0z, filter(0zDEADBEEF, '0')) ! call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE')) ! call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE')) ! call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF')) ! call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1')) ! call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02')) ! call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2')) endfunc " map() item in blob func Test_blob_map() ! call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1')) ! call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key')) ! call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val')) ! ! call assert_fails("call map(0z00, '[9]')", 'E978:') endfunc func Test_blob_index() ! call assert_equal(2, index(0zDEADBEEF, 0xBE)) ! call assert_equal(-1, index(0zDEADBEEF, 0)) ! call assert_equal(2, index(0z11111111, 0x11, 2)) ! call assert_equal(3, 0z11110111->index(0x11, 2)) ! call assert_equal(2, index(0z11111111, 0x11, -2)) ! call assert_equal(3, index(0z11110111, 0x11, -2)) ! call assert_equal(0, index(0z11110111, 0x11, -10)) ! call assert_fails("echo index(0z11110111, 0x11, [])", 'E745:') ! call assert_equal(-1, index(test_null_blob(), 1)) ! ! call assert_fails('call index("asdf", 0)', 'E897:') endfunc func Test_blob_insert() ! let b = 0zDEADBEEF ! call insert(b, 0x33) ! call assert_equal(0z33DEADBEEF, b) ! ! let b = 0zDEADBEEF ! call insert(b, 0x33, 2) ! call assert_equal(0zDEAD33BEEF, b) ! ! call assert_fails('call insert(b, -1)', 'E475:') ! call assert_fails('call insert(b, 257)', 'E475:') ! call assert_fails('call insert(b, 0, [9])', 'E745:') ! call assert_fails('call insert(b, 0, -20)', 'E475:') ! call assert_fails('call insert(b, 0, 20)', 'E475:') ! call assert_fails('call insert(b, [])', 'E745:') call assert_equal(0, insert(test_null_blob(), 0x33)) endfunc func Test_blob_reverse() ! call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF)) ! call assert_equal(0zBEADDE, reverse(0zDEADBE)) ! call assert_equal(0zADDE, reverse(0zDEAD)) ! call assert_equal(0zDE, reverse(0zDE)) ! call assert_equal(0z, reverse(test_null_blob())) endfunc func Test_blob_json_encode() ! call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF)) ! call assert_equal('[]', json_encode(0z)) endfunc func Test_blob_lock() ! let b = 0z112233 ! lockvar b ! call assert_fails('let b = 0z44', 'E741:') ! unlockvar b ! let b = 0z44 endfunc func Test_blob_sort() if has('float') ! call assert_fails('call sort([1.0, 0z11], "f")', 'E975:') ! else ! call assert_fails('call sort(["abc", 0z11], "f")', 'E702:') endif endfunc " vim: shiftwidth=2 sts=2 expandtab --- 464,636 ---- " filter() item in blob func Test_blob_filter() ! let lines =<< trim END ! call assert_equal(test_null_blob(), filter(test_null_blob(), '0')) ! call assert_equal(0z, filter(0zDEADBEEF, '0')) ! call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE')) ! call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE')) ! call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF')) ! call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1')) ! call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02')) ! call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2')) ! END ! call CheckLegacyAndVim9Success(lines) endfunc " map() item in blob func Test_blob_map() ! let lines =<< trim END ! call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1')) ! call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key')) ! call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val')) ! END ! call CheckLegacyAndVim9Success(lines) ! ! let lines =<< trim END ! call map(0z00, '[9]') ! END ! call CheckLegacyAndVim9Failure(lines, 'E978:') endfunc func Test_blob_index() ! let lines =<< trim END ! call assert_equal(2, index(0zDEADBEEF, 0xBE)) ! call assert_equal(-1, index(0zDEADBEEF, 0)) ! call assert_equal(2, index(0z11111111, 0x11, 2)) ! call assert_equal(3, 0z11110111->index(0x11, 2)) ! call assert_equal(2, index(0z11111111, 0x11, -2)) ! call assert_equal(3, index(0z11110111, 0x11, -2)) ! call assert_equal(0, index(0z11110111, 0x11, -10)) ! call assert_equal(-1, index(test_null_blob(), 1)) ! END ! call CheckLegacyAndVim9Success(lines) ! ! let lines =<< trim END ! echo index(0z11110111, 0x11, []) ! END ! call CheckLegacyAndVim9Failure(lines, 'E745:') ! ! let lines =<< trim END ! call index("asdf", 0) ! END ! call CheckLegacyAndVim9Failure(lines, 'E897:') endfunc func Test_blob_insert() ! let lines =<< trim END ! VAR b = 0zDEADBEEF ! call insert(b, 0x33) ! call assert_equal(0z33DEADBEEF, b) ! ! LET b = 0zDEADBEEF ! call insert(b, 0x33, 2) ! call assert_equal(0zDEAD33BEEF, b) ! END ! call CheckLegacyAndVim9Success(lines) ! ! " only works in legacy script call assert_equal(0, insert(test_null_blob(), 0x33)) + + let lines =<< trim END + VAR b = 0zDEADBEEF + call insert(b, -1) + END + call CheckLegacyAndVim9Failure(lines, 'E475:') + + let lines =<< trim END + VAR b = 0zDEADBEEF + call insert(b, 257) + END + call CheckLegacyAndVim9Failure(lines, 'E475:') + + let lines =<< trim END + VAR b = 0zDEADBEEF + call insert(b, 0, [9]) + END + call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E745:']) + + let lines =<< trim END + VAR b = 0zDEADBEEF + call insert(b, 0, -20) + END + call CheckLegacyAndVim9Failure(lines, 'E475:') + + let lines =<< trim END + VAR b = 0zDEADBEEF + call insert(b, 0, 20) + END + call CheckLegacyAndVim9Failure(lines, 'E475:') + + let lines =<< trim END + VAR b = 0zDEADBEEF + call insert(b, []) + END + call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E745:']) + + let lines =<< trim END + insert(test_null_blob(), 0x33) + END + call CheckDefExecAndScriptFailure(lines, 'E1131:') endfunc func Test_blob_reverse() ! let lines =<< trim END ! call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF)) ! call assert_equal(0zBEADDE, reverse(0zDEADBE)) ! call assert_equal(0zADDE, reverse(0zDEAD)) ! call assert_equal(0zDE, reverse(0zDE)) ! call assert_equal(0z, reverse(test_null_blob())) ! END ! call CheckLegacyAndVim9Success(lines) endfunc func Test_blob_json_encode() ! let lines =<< trim END ! call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF)) ! call assert_equal('[]', json_encode(0z)) ! END ! call CheckLegacyAndVim9Success(lines) endfunc func Test_blob_lock() ! let lines =<< trim END ! let b = 0z112233 ! lockvar b ! unlockvar b ! let b = 0z44 ! END ! call CheckScriptSuccess(lines) ! ! let lines =<< trim END ! vim9script ! var b = 0z112233 ! lockvar b ! unlockvar b ! b = 0z44 ! END ! call CheckScriptSuccess(lines) ! ! let lines =<< trim END ! let b = 0z112233 ! lockvar b ! let b = 0z44 ! END ! call CheckScriptFailure(lines, 'E741:') ! ! let lines =<< trim END ! vim9script ! var b = 0z112233 ! lockvar b ! b = 0z44 ! END ! call CheckScriptFailure(lines, 'E741:') endfunc func Test_blob_sort() if has('float') ! call CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:') endif + call CheckLegacyAndVim9Failure(['call sort(["abc", 0z11], "f")'], 'E892:') endfunc " vim: shiftwidth=2 sts=2 expandtab *** ../vim-8.2.2781/src/testdir/test_vim9_builtin.vim 2021-04-18 14:12:27.707697058 +0200 --- src/testdir/test_vim9_builtin.vim 2021-04-18 15:41:50.381044957 +0200 *************** *** 719,724 **** --- 719,734 ---- endfor res->assert_equal(6) + var lines =<< trim END + insert(test_null_list(), 123) + END + CheckDefExecAndScriptFailure(lines, 'E1130:', 1) + + lines =<< trim END + insert(test_null_blob(), 123) + END + CheckDefExecAndScriptFailure(lines, 'E1131:', 1) + assert_equal([1, 2, 3], insert([2, 3], 1)) assert_equal([1, 2, 3], insert([2, 3], s:number_one)) assert_equal([1, 2, 3], insert([1, 2], 3, 2)) *** ../vim-8.2.2781/src/version.c 2021-04-18 14:12:27.707697058 +0200 --- src/version.c 2021-04-18 14:38:31.733302175 +0200 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 2782, /**/ -- "A clear conscience is usually the sign of a bad memory." -- Steven Wright /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///