0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.2782: Vim9: blob operations not fully tested

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().
This commit is contained in:
Bram Moolenaar 2021-04-18 15:48:04 +02:00
parent b7c21afef1
commit 39211cba72
4 changed files with 252 additions and 100 deletions

View File

@ -2223,7 +2223,7 @@ filter_map(typval_T *argvars, typval_T *rettv, filtermap_T filtermap)
if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL if (filter_map_one(&tv, expr, filtermap, &newtv, &rem) == FAIL
|| did_emsg) || did_emsg)
break; break;
if (newtv.v_type != VAR_NUMBER) if (newtv.v_type != VAR_NUMBER && newtv.v_type != VAR_BOOL)
{ {
clear_tv(&newtv); clear_tv(&newtv);
emsg(_(e_invalblob)); emsg(_(e_invalblob));
@ -2736,7 +2736,6 @@ f_insert(typval_T *argvars, typval_T *rettv)
{ {
long before = 0; long before = 0;
listitem_T *item; listitem_T *item;
list_T *l;
int error = FALSE; int error = FALSE;
if (argvars[0].v_type == VAR_BLOB) if (argvars[0].v_type == VAR_BLOB)
@ -2745,7 +2744,11 @@ f_insert(typval_T *argvars, typval_T *rettv)
char_u *p; char_u *p;
if (argvars[0].vval.v_blob == NULL) if (argvars[0].vval.v_blob == NULL)
{
if (in_vim9script())
emsg(_(e_cannot_add_to_null_blob));
return; return;
}
len = blob_len(argvars[0].vval.v_blob); len = blob_len(argvars[0].vval.v_blob);
if (argvars[2].v_type != VAR_UNKNOWN) if (argvars[2].v_type != VAR_UNKNOWN)
@ -2779,8 +2782,16 @@ f_insert(typval_T *argvars, typval_T *rettv)
} }
else if (argvars[0].v_type != VAR_LIST) else if (argvars[0].v_type != VAR_LIST)
semsg(_(e_listblobarg), "insert()"); semsg(_(e_listblobarg), "insert()");
else if ((l = argvars[0].vval.v_list) != NULL else
&& !value_check_lock(l->lv_lock, {
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)) (char_u *)N_("insert() argument"), TRUE))
{ {
if (argvars[2].v_type != VAR_UNKNOWN) if (argvars[2].v_type != VAR_UNKNOWN)
@ -2805,6 +2816,7 @@ f_insert(typval_T *argvars, typval_T *rettv)
copy_tv(&argvars[0], rettv); copy_tv(&argvars[0], rettv);
} }
} }
}
} }
/* /*

View File

@ -379,45 +379,84 @@ endfunc
" Test removing items in blob " Test removing items in blob
func Test_blob_func_remove() func Test_blob_func_remove()
" Test removing 1 element let lines =<< trim END
let b = 0zDEADBEEF #" Test removing 1 element
VAR b = 0zDEADBEEF
call assert_equal(0xDE, remove(b, 0)) call assert_equal(0xDE, remove(b, 0))
call assert_equal(0zADBEEF, b) call assert_equal(0zADBEEF, b)
let b = 0zDEADBEEF LET b = 0zDEADBEEF
call assert_equal(0xEF, remove(b, -1)) call assert_equal(0xEF, remove(b, -1))
call assert_equal(0zDEADBE, b) call assert_equal(0zDEADBE, b)
let b = 0zDEADBEEF LET b = 0zDEADBEEF
call assert_equal(0xAD, remove(b, 1)) call assert_equal(0xAD, remove(b, 1))
call assert_equal(0zDEBEEF, b) call assert_equal(0zDEBEEF, b)
" Test removing range of element(s) #" Test removing range of element(s)
let b = 0zDEADBEEF LET b = 0zDEADBEEF
call assert_equal(0zBE, remove(b, 2, 2)) call assert_equal(0zBE, remove(b, 2, 2))
call assert_equal(0zDEADEF, b) call assert_equal(0zDEADEF, b)
let b = 0zDEADBEEF LET b = 0zDEADBEEF
call assert_equal(0zADBE, remove(b, 1, 2)) call assert_equal(0zADBE, remove(b, 1, 2))
call assert_equal(0zDEEF, b) call assert_equal(0zDEEF, b)
END
call CheckLegacyAndVim9Success(lines)
" Test invalid cases " Test invalid cases
let b = 0zDEADBEEF let lines =<< trim END
call assert_fails("call remove(b, 5)", 'E979:') VAR b = 0zDEADBEEF
call assert_fails("call remove(b, 1, 5)", 'E979:') call remove(b, 5)
call assert_fails("call remove(b, 3, 2)", 'E979:') END
call assert_fails("call remove(1, 0)", 'E896:') call CheckLegacyAndVim9Failure(lines, 'E979:')
call assert_fails("call remove(b, b)", 'E974:')
call assert_fails("call remove(b, 1, [])", 'E745:') let lines =<< trim END
call assert_fails("call remove(test_null_blob(), 1, 2)", 'E979:') 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 endfunc
func Test_blob_read_write() func Test_blob_read_write()
let b = 0zDEADBEEF let lines =<< trim END
VAR b = 0zDEADBEEF
call writefile(b, 'Xblob') call writefile(b, 'Xblob')
let br = readfile('Xblob', 'B') VAR br = readfile('Xblob', 'B')
call assert_equal(b, br) call assert_equal(b, br)
call delete('Xblob') call delete('Xblob')
END
call CheckLegacyAndVim9Success(lines)
" This was crashing when calling readfile() with a directory. " This was crashing when calling readfile() with a directory.
call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory') call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
@ -425,6 +464,7 @@ endfunc
" filter() item in blob " filter() item in blob
func Test_blob_filter() func Test_blob_filter()
let lines =<< trim END
call assert_equal(test_null_blob(), filter(test_null_blob(), '0')) call assert_equal(test_null_blob(), filter(test_null_blob(), '0'))
call assert_equal(0z, filter(0zDEADBEEF, '0')) call assert_equal(0z, filter(0zDEADBEEF, '0'))
call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE')) call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
@ -433,18 +473,27 @@ func Test_blob_filter()
call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1')) call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02')) call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2')) call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
" map() item in blob " map() item in blob
func Test_blob_map() func Test_blob_map()
let lines =<< trim END
call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1')) call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key')) call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val')) call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
END
call CheckLegacyAndVim9Success(lines)
call assert_fails("call map(0z00, '[9]')", 'E978:') let lines =<< trim END
call map(0z00, '[9]')
END
call CheckLegacyAndVim9Failure(lines, 'E978:')
endfunc endfunc
func Test_blob_index() func Test_blob_index()
let lines =<< trim END
call assert_equal(2, index(0zDEADBEEF, 0xBE)) call assert_equal(2, index(0zDEADBEEF, 0xBE))
call assert_equal(-1, index(0zDEADBEEF, 0)) call assert_equal(-1, index(0zDEADBEEF, 0))
call assert_equal(2, index(0z11111111, 0x11, 2)) call assert_equal(2, index(0z11111111, 0x11, 2))
@ -452,57 +501,136 @@ func Test_blob_index()
call assert_equal(2, index(0z11111111, 0x11, -2)) call assert_equal(2, index(0z11111111, 0x11, -2))
call assert_equal(3, index(0z11110111, 0x11, -2)) call assert_equal(3, index(0z11110111, 0x11, -2))
call assert_equal(0, index(0z11110111, 0x11, -10)) 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_equal(-1, index(test_null_blob(), 1))
END
call CheckLegacyAndVim9Success(lines)
call assert_fails('call index("asdf", 0)', 'E897:') 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 endfunc
func Test_blob_insert() func Test_blob_insert()
let b = 0zDEADBEEF let lines =<< trim END
VAR b = 0zDEADBEEF
call insert(b, 0x33) call insert(b, 0x33)
call assert_equal(0z33DEADBEEF, b) call assert_equal(0z33DEADBEEF, b)
let b = 0zDEADBEEF LET b = 0zDEADBEEF
call insert(b, 0x33, 2) call insert(b, 0x33, 2)
call assert_equal(0zDEAD33BEEF, b) call assert_equal(0zDEAD33BEEF, b)
END
call CheckLegacyAndVim9Success(lines)
call assert_fails('call insert(b, -1)', 'E475:') " only works in legacy script
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)) 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 endfunc
func Test_blob_reverse() func Test_blob_reverse()
let lines =<< trim END
call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF)) call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF))
call assert_equal(0zBEADDE, reverse(0zDEADBE)) call assert_equal(0zBEADDE, reverse(0zDEADBE))
call assert_equal(0zADDE, reverse(0zDEAD)) call assert_equal(0zADDE, reverse(0zDEAD))
call assert_equal(0zDE, reverse(0zDE)) call assert_equal(0zDE, reverse(0zDE))
call assert_equal(0z, reverse(test_null_blob())) call assert_equal(0z, reverse(test_null_blob()))
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
func Test_blob_json_encode() func Test_blob_json_encode()
let lines =<< trim END
call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF)) call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF))
call assert_equal('[]', json_encode(0z)) call assert_equal('[]', json_encode(0z))
END
call CheckLegacyAndVim9Success(lines)
endfunc endfunc
func Test_blob_lock() func Test_blob_lock()
let lines =<< trim END
let b = 0z112233 let b = 0z112233
lockvar b lockvar b
call assert_fails('let b = 0z44', 'E741:')
unlockvar b unlockvar b
let b = 0z44 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 endfunc
func Test_blob_sort() func Test_blob_sort()
if has('float') if has('float')
call assert_fails('call sort([1.0, 0z11], "f")', 'E975:') call CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:')
else
call assert_fails('call sort(["abc", 0z11], "f")', 'E702:')
endif endif
call CheckLegacyAndVim9Failure(['call sort(["abc", 0z11], "f")'], 'E892:')
endfunc endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@ -719,6 +719,16 @@ def Test_insert()
endfor endfor
res->assert_equal(6) 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], 1))
assert_equal([1, 2, 3], insert([2, 3], s:number_one)) assert_equal([1, 2, 3], insert([2, 3], s:number_one))
assert_equal([1, 2, 3], insert([1, 2], 3, 2)) assert_equal([1, 2, 3], insert([1, 2], 3, 2))

View File

@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2782,
/**/ /**/
2781, 2781,
/**/ /**/