Patch 8.2.2782

6 views
Skip to first unread message

Bram Moolenaar

unread,
Apr 18, 2021, 9:48:40 AM4/18/21
to vim...@googlegroups.com

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 -- Br...@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 ///
Reply all
Reply to author
Forward
0 new messages