2020-11-17 20:11:00 -07:00
|
|
|
" Tests for the Blob types
|
|
|
|
|
2023-02-28 06:01:36 -07:00
|
|
|
source check.vim
|
2023-02-23 23:36:20 -07:00
|
|
|
source vim9.vim
|
|
|
|
|
2020-11-17 20:11:00 -07:00
|
|
|
func TearDown()
|
|
|
|
" Run garbage collection after every test
|
|
|
|
call test_garbagecollect_now()
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Tests for Blob type
|
|
|
|
|
|
|
|
" Blob creation from constant
|
|
|
|
func Test_blob_create()
|
2023-02-23 23:36:20 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
call assert_equal(v:t_blob, type(b))
|
|
|
|
call assert_equal(4, len(b))
|
|
|
|
call assert_equal(0xDE, b[0])
|
|
|
|
call assert_equal(0xAD, b[1])
|
|
|
|
call assert_equal(0xBE, b[2])
|
|
|
|
call assert_equal(0xEF, b[3])
|
|
|
|
call assert_fails('VAR x = b[4]')
|
|
|
|
|
|
|
|
call assert_equal(0xDE, get(b, 0))
|
|
|
|
call assert_equal(0xEF, get(b, 3))
|
|
|
|
|
|
|
|
call assert_fails('VAR b = 0z1', 'E973:')
|
|
|
|
call assert_fails('VAR b = 0z1x', 'E973:')
|
|
|
|
call assert_fails('VAR b = 0z12345', 'E973:')
|
|
|
|
|
|
|
|
call assert_equal(0z, v:_null_blob)
|
|
|
|
|
|
|
|
LET b = 0z001122.33445566.778899.aabbcc.dd
|
|
|
|
call assert_equal(0z00112233445566778899aabbccdd, b)
|
|
|
|
call assert_fails('VAR b = 0z1.1')
|
|
|
|
call assert_fails('VAR b = 0z.')
|
|
|
|
call assert_fails('VAR b = 0z001122.')
|
|
|
|
call assert_fails('call get("", 1)', 'E896:')
|
|
|
|
call assert_equal(0, len(v:_null_blob))
|
2023-08-16 22:01:45 -07:00
|
|
|
call assert_equal(0z, copy(v:_null_blob))
|
2023-02-23 23:36:20 -07:00
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
" assignment to a blob
|
|
|
|
func Test_blob_assign()
|
2023-02-23 23:36:20 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
VAR b2 = b[1 : 2]
|
|
|
|
call assert_equal(0zADBE, b2)
|
|
|
|
|
|
|
|
VAR bcopy = b[:]
|
|
|
|
call assert_equal(b, bcopy)
|
|
|
|
call assert_false(b is bcopy)
|
|
|
|
|
|
|
|
LET b = 0zDEADBEEF
|
|
|
|
LET b2 = b
|
|
|
|
call assert_true(b is b2)
|
|
|
|
LET b[:] = 0z11223344
|
|
|
|
call assert_equal(0z11223344, b)
|
|
|
|
call assert_equal(0z11223344, b2)
|
|
|
|
call assert_true(b is b2)
|
|
|
|
|
|
|
|
LET b = 0zDEADBEEF
|
|
|
|
LET b[3 :] = 0z66
|
|
|
|
call assert_equal(0zDEADBE66, b)
|
|
|
|
LET b[: 1] = 0z8899
|
|
|
|
call assert_equal(0z8899BE66, b)
|
|
|
|
|
|
|
|
LET b = 0zDEADBEEF
|
|
|
|
LET b += 0z99
|
|
|
|
call assert_equal(0zDEADBEEF99, b)
|
|
|
|
|
|
|
|
VAR l = [0z12]
|
|
|
|
VAR m = deepcopy(l)
|
|
|
|
LET m[0] = 0z34 #" E742 or E741 should not occur.
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
|
|
|
|
2023-02-27 22:30:08 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
LET b[2 : 3] = 0z112233
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E972:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
LET b[2 : 3] = 0z11
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E972:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
LET b[3 : 2] = 0z
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E979:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
LET b ..= 0z33
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
LET b ..= "xx"
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
LET b += "xx"
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
LET b[1 : 1] ..= 0z55
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1183:', 'E734:'])
|
2020-11-24 14:46:43 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_get_range()
|
2023-02-27 23:27:47 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011223344
|
|
|
|
call assert_equal(0z2233, b[2 : 3])
|
|
|
|
call assert_equal(0z223344, b[2 : -1])
|
|
|
|
call assert_equal(0z00, b[0 : -5])
|
|
|
|
call assert_equal(0z, b[0 : -11])
|
|
|
|
call assert_equal(0z44, b[-1 :])
|
|
|
|
call assert_equal(0z0011223344, b[:])
|
|
|
|
call assert_equal(0z0011223344, b[: -1])
|
|
|
|
call assert_equal(0z, b[5 : 6])
|
|
|
|
call assert_equal(0z0011, b[-10 : 1])
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
|
|
|
|
|
|
|
" legacy script white space
|
2020-11-24 14:46:43 -07:00
|
|
|
let b = 0z0011223344
|
|
|
|
call assert_equal(0z2233, b[2:3])
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
2020-11-25 10:27:39 -07:00
|
|
|
func Test_blob_get()
|
2023-02-27 23:27:47 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011223344
|
|
|
|
call assert_equal(0x00, get(b, 0))
|
|
|
|
call assert_equal(0x22, get(b, 2, 999))
|
|
|
|
call assert_equal(0x44, get(b, 4))
|
|
|
|
call assert_equal(0x44, get(b, -1))
|
|
|
|
call assert_equal(-1, get(b, 5))
|
|
|
|
call assert_equal(999, get(b, 5, 999))
|
|
|
|
call assert_equal(-1, get(b, -8))
|
|
|
|
call assert_equal(999, get(b, -8, 999))
|
|
|
|
call assert_equal(10, get(v:_null_blob, 2, 10))
|
|
|
|
|
|
|
|
call assert_equal(0x00, b[0])
|
|
|
|
call assert_equal(0x22, b[2])
|
|
|
|
call assert_equal(0x44, b[4])
|
|
|
|
call assert_equal(0x44, b[-1])
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011223344
|
|
|
|
echo b[5]
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E979:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011223344
|
|
|
|
echo b[-8]
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E979:')
|
2020-11-25 10:27:39 -07:00
|
|
|
endfunc
|
|
|
|
|
2020-11-17 20:11:00 -07:00
|
|
|
func Test_blob_to_string()
|
2023-02-27 23:27:47 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z00112233445566778899aabbccdd
|
|
|
|
call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b))
|
|
|
|
call assert_equal(b, eval(string(b)))
|
|
|
|
call remove(b, 4, -1)
|
|
|
|
call assert_equal('0z00112233', string(b))
|
|
|
|
call remove(b, 0, 3)
|
|
|
|
call assert_equal('0z', string(b))
|
|
|
|
call assert_equal('0z', string(v:_null_blob))
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_compare()
|
2023-02-27 23:27:47 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b1 = 0z0011
|
|
|
|
VAR b2 = 0z1100
|
|
|
|
VAR b3 = 0z001122
|
|
|
|
call assert_true(b1 == b1)
|
|
|
|
call assert_false(b1 == b2)
|
|
|
|
call assert_false(b1 == b3)
|
|
|
|
call assert_true(b1 != b2)
|
|
|
|
call assert_true(b1 != b3)
|
|
|
|
call assert_true(b1 == 0z0011)
|
|
|
|
|
|
|
|
call assert_false(b1 is b2)
|
|
|
|
LET b2 = b1
|
|
|
|
call assert_true(b1 == b2)
|
|
|
|
call assert_true(b1 is b2)
|
|
|
|
LET b2 = copy(b1)
|
|
|
|
call assert_true(b1 == b2)
|
|
|
|
call assert_false(b1 is b2)
|
|
|
|
LET b2 = b1[:]
|
|
|
|
call assert_true(b1 == b2)
|
|
|
|
call assert_false(b1 is b2)
|
|
|
|
call assert_true(b1 isnot b2)
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b1 = 0z0011
|
|
|
|
echo b1 == 9
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b1 = 0z0011
|
|
|
|
echo b1 != 9
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b1 = 0z0011
|
|
|
|
VAR b2 = 0z1100
|
|
|
|
VAR x = b1 > b2
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b1 = 0z0011
|
|
|
|
VAR b2 = 0z1100
|
|
|
|
VAR x = b1 < b2
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b1 = 0z0011
|
|
|
|
VAR b2 = 0z1100
|
|
|
|
VAR x = b1 - b2
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b1 = 0z0011
|
|
|
|
VAR b2 = 0z1100
|
|
|
|
VAR x = b1 / b2
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b1 = 0z0011
|
|
|
|
VAR b2 = 0z1100
|
|
|
|
VAR x = b1 * b2
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
2023-02-27 23:27:47 -07:00
|
|
|
func Test_blob_index_assign()
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z00
|
|
|
|
LET b[1] = 0x11
|
|
|
|
LET b[2] = 0x22
|
|
|
|
call assert_equal(0z001122, b)
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z00
|
|
|
|
LET b[2] = 0x33
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E979:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z00
|
|
|
|
LET b[-2] = 0x33
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E979:')
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_for_loop()
|
2023-02-28 00:46:53 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR blob = 0z00010203
|
|
|
|
VAR i = 0
|
|
|
|
for byte in blob
|
|
|
|
call assert_equal(i, byte)
|
|
|
|
LET i += 1
|
|
|
|
endfor
|
|
|
|
call assert_equal(4, i)
|
|
|
|
|
|
|
|
LET blob = 0z00
|
2021-07-29 12:25:46 -07:00
|
|
|
call remove(blob, 0)
|
2023-02-28 00:46:53 -07:00
|
|
|
call assert_equal(0, len(blob))
|
|
|
|
for byte in blob
|
|
|
|
call assert_report('loop over empty blob')
|
|
|
|
endfor
|
|
|
|
|
|
|
|
LET blob = 0z0001020304
|
|
|
|
LET i = 0
|
|
|
|
for byte in blob
|
|
|
|
call assert_equal(i, byte)
|
|
|
|
if i == 1
|
|
|
|
call remove(blob, 0)
|
|
|
|
elseif i == 3
|
|
|
|
call remove(blob, 3)
|
|
|
|
endif
|
|
|
|
LET i += 1
|
|
|
|
endfor
|
|
|
|
call assert_equal(5, i)
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_concatenate()
|
2023-03-01 08:23:39 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011
|
|
|
|
LET b += 0z2233
|
|
|
|
call assert_equal(0z00112233, b)
|
|
|
|
|
|
|
|
LET b = 0zDEAD + 0zBEEF
|
|
|
|
call assert_equal(0zDEADBEEF, b)
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
2020-11-17 20:11:00 -07:00
|
|
|
|
2023-03-01 08:23:39 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011
|
|
|
|
LET b += "a"
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
|
2020-11-17 20:11:00 -07:00
|
|
|
|
2023-03-01 08:23:39 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011
|
|
|
|
LET b += 88
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
2020-11-24 14:37:52 -07:00
|
|
|
func Test_blob_add()
|
2023-03-01 08:23:39 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011
|
|
|
|
call add(b, 0x22)
|
|
|
|
call assert_equal(0z001122, b)
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
|
|
|
|
|
|
|
" Only works in legacy script
|
2020-11-24 14:37:52 -07:00
|
|
|
let b = 0z0011
|
|
|
|
call add(b, '51')
|
2023-03-01 08:23:39 -07:00
|
|
|
call assert_equal(0z001133, b)
|
2022-10-26 04:53:54 -07:00
|
|
|
call assert_equal(1, add(v:_null_blob, 0x22))
|
2020-11-24 14:37:52 -07:00
|
|
|
|
2023-03-01 08:23:39 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011
|
|
|
|
call add(b, [9])
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, ['E745:', 'E1012:', 'E745:'])
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0z0011
|
|
|
|
call add("", 0x01)
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E897:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
add(v:_null_blob, 0x22)
|
|
|
|
END
|
|
|
|
call CheckDefExecAndScriptFailure(lines, 'E1131:')
|
2023-08-16 22:01:45 -07:00
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
let b = 0zDEADBEEF
|
|
|
|
lockvar b
|
|
|
|
call add(b, 0)
|
|
|
|
unlockvar b
|
|
|
|
END
|
|
|
|
call CheckScriptFailure(lines, 'E741:')
|
2020-11-24 14:37:52 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_empty()
|
|
|
|
call assert_false(empty(0z001122))
|
|
|
|
call assert_true(empty(0z))
|
|
|
|
call assert_true(empty(v:_null_blob))
|
|
|
|
endfunc
|
|
|
|
|
2020-11-17 20:11:00 -07:00
|
|
|
" Test removing items in blob
|
|
|
|
func Test_blob_func_remove()
|
2023-02-28 00:50:35 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
#" Test removing 1 element
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
call assert_equal(0xDE, remove(b, 0))
|
|
|
|
call assert_equal(0zADBEEF, b)
|
2020-11-17 20:11:00 -07:00
|
|
|
|
2023-02-28 00:50:35 -07:00
|
|
|
LET b = 0zDEADBEEF
|
|
|
|
call assert_equal(0xEF, remove(b, -1))
|
|
|
|
call assert_equal(0zDEADBE, b)
|
2020-11-17 20:11:00 -07:00
|
|
|
|
2023-02-28 00:50:35 -07:00
|
|
|
LET b = 0zDEADBEEF
|
|
|
|
call assert_equal(0xAD, remove(b, 1))
|
|
|
|
call assert_equal(0zDEBEEF, b)
|
2020-11-17 20:11:00 -07:00
|
|
|
|
2023-02-28 00:50:35 -07:00
|
|
|
#" Test removing range of element(s)
|
|
|
|
LET b = 0zDEADBEEF
|
|
|
|
call assert_equal(0zBE, remove(b, 2, 2))
|
|
|
|
call assert_equal(0zDEADEF, b)
|
2020-11-17 20:11:00 -07:00
|
|
|
|
2023-02-28 00:50:35 -07:00
|
|
|
LET b = 0zDEADBEEF
|
|
|
|
call assert_equal(0zADBE, remove(b, 1, 2))
|
|
|
|
call assert_equal(0zDEEF, b)
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
2020-11-17 20:11:00 -07:00
|
|
|
|
|
|
|
" Test invalid cases
|
2023-02-28 00:50:35 -07:00
|
|
|
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(v:_null_blob, 1, 2)
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E979:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
let b = 0zDEADBEEF
|
|
|
|
lockvar b
|
|
|
|
call remove(b, 0)
|
|
|
|
unlockvar b
|
|
|
|
END
|
|
|
|
call CheckScriptFailure(lines, 'E741:')
|
|
|
|
|
|
|
|
" can only check at script level, not in a :def function
|
|
|
|
let lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
var b = 0zDEADBEEF
|
|
|
|
lockvar b
|
|
|
|
remove(b, 0)
|
|
|
|
END
|
|
|
|
call CheckScriptFailure(lines, 'E741:')
|
2023-08-16 22:01:45 -07:00
|
|
|
|
|
|
|
call assert_fails('echo remove(0z1020, [])', 'E745:')
|
|
|
|
call assert_fails('echo remove(0z1020, 0, [])', 'E745:')
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_read_write()
|
2023-02-28 00:50:35 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
VAR b = 0zDEADBEEF
|
|
|
|
call writefile(b, 'Xblob')
|
|
|
|
VAR br = readfile('Xblob', 'B')
|
|
|
|
call assert_equal(b, br)
|
2023-02-28 04:04:32 -07:00
|
|
|
VAR br2 = readblob('Xblob')
|
|
|
|
call assert_equal(b, br2)
|
|
|
|
VAR br3 = readblob('Xblob', 1)
|
|
|
|
call assert_equal(b[1 :], br3)
|
|
|
|
VAR br4 = readblob('Xblob', 1, 2)
|
|
|
|
call assert_equal(b[1 : 2], br4)
|
|
|
|
VAR br5 = readblob('Xblob', -3)
|
|
|
|
call assert_equal(b[-3 :], br5)
|
|
|
|
VAR br6 = readblob('Xblob', -3, 2)
|
|
|
|
call assert_equal(b[-3 : -2], br6)
|
|
|
|
|
2023-02-28 04:29:59 -07:00
|
|
|
#" reading past end of file, empty result
|
2023-02-28 04:04:32 -07:00
|
|
|
VAR br1e = readblob('Xblob', 10000)
|
|
|
|
call assert_equal(0z, br1e)
|
2023-02-28 04:29:59 -07:00
|
|
|
|
|
|
|
#" reading too much, result is truncated
|
|
|
|
VAR blong = readblob('Xblob', -1000)
|
|
|
|
call assert_equal(b, blong)
|
|
|
|
LET blong = readblob('Xblob', -10, 8)
|
|
|
|
call assert_equal(b, blong)
|
|
|
|
LET blong = readblob('Xblob', 0, 10)
|
|
|
|
call assert_equal(b, blong)
|
2023-02-28 04:04:32 -07:00
|
|
|
|
2023-02-28 00:50:35 -07:00
|
|
|
call delete('Xblob')
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
2020-11-25 09:02:10 -07:00
|
|
|
|
2023-02-28 04:23:28 -07:00
|
|
|
if filereadable('/dev/random')
|
|
|
|
let b = readblob('/dev/random', 0, 10)
|
|
|
|
call assert_equal(10, len(b))
|
|
|
|
endif
|
|
|
|
|
2023-02-28 04:04:32 -07:00
|
|
|
call assert_fails("call readblob('notexist')", 'E484:')
|
|
|
|
" TODO: How do we test for the E485 error?
|
|
|
|
|
2020-11-25 09:02:10 -07:00
|
|
|
" This was crashing when calling readfile() with a directory.
|
|
|
|
call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
" filter() item in blob
|
|
|
|
func Test_blob_filter()
|
2023-02-28 00:50:35 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
call assert_equal(v:_null_blob, filter(v:_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)
|
2023-08-16 22:01:45 -07:00
|
|
|
call assert_fails('echo filter(0z10, "a10")', 'E121:')
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
" map() item in blob
|
|
|
|
func Test_blob_map()
|
2023-02-28 00:50:35 -07:00
|
|
|
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)
|
2020-11-24 14:37:52 -07:00
|
|
|
|
2023-02-28 00:50:35 -07:00
|
|
|
let lines =<< trim END
|
|
|
|
call map(0z00, '[9]')
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Failure(lines, 'E978:')
|
2023-08-16 22:01:45 -07:00
|
|
|
call assert_fails('echo map(0z10, "a10")', 'E121:')
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_index()
|
2023-02-28 00:50:35 -07:00
|
|
|
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(v:_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:')
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_insert()
|
2023-02-28 00:50:35 -07:00
|
|
|
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
|
2021-07-29 14:32:22 -07:00
|
|
|
call assert_equal(0, insert(v:_null_blob, 0x33))
|
2021-08-01 10:27:41 -07:00
|
|
|
|
2023-02-28 00:50:35 -07:00
|
|
|
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(v:_null_blob, 0x33)
|
|
|
|
END
|
|
|
|
call CheckDefExecAndScriptFailure(lines, 'E1131:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
let b = 0zDEADBEEF
|
|
|
|
lockvar b
|
|
|
|
call insert(b, 3)
|
|
|
|
unlockvar b
|
|
|
|
END
|
|
|
|
call CheckScriptFailure(lines, 'E741:')
|
|
|
|
|
|
|
|
let lines =<< trim END
|
|
|
|
vim9script
|
|
|
|
var b = 0zDEADBEEF
|
|
|
|
lockvar b
|
|
|
|
insert(b, 3)
|
|
|
|
END
|
|
|
|
call CheckScriptFailure(lines, 'E741:')
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_reverse()
|
2023-02-28 00:50:35 -07:00
|
|
|
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(v:_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('[222, 173, 190, 239]', json_encode(0zDEADBEEF))
|
|
|
|
call assert_equal('[]', json_encode(0z))
|
|
|
|
END
|
|
|
|
call CheckLegacyAndVim9Success(lines)
|
2020-11-17 20:11:00 -07:00
|
|
|
endfunc
|
|
|
|
|
2020-11-24 14:46:43 -07:00
|
|
|
func Test_blob_lock()
|
2023-02-28 00:50:35 -07:00
|
|
|
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:')
|
2020-11-24 14:46:43 -07:00
|
|
|
endfunc
|
|
|
|
|
|
|
|
func Test_blob_sort()
|
2021-07-29 13:30:01 -07:00
|
|
|
if has('float')
|
2023-02-28 00:50:35 -07:00
|
|
|
call CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:')
|
2021-07-29 13:30:01 -07:00
|
|
|
endif
|
2023-02-28 01:06:56 -07:00
|
|
|
call CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:')
|
2020-11-24 14:46:43 -07:00
|
|
|
endfunc
|
|
|
|
|
2023-02-28 05:18:52 -07:00
|
|
|
" Tests for the blob2list() function
|
|
|
|
func Test_blob2list()
|
|
|
|
call assert_fails('let v = blob2list(10)', 'E1238: Blob required for argument 1')
|
|
|
|
eval 0zFFFF->blob2list()->assert_equal([255, 255])
|
|
|
|
let tests = [[0z0102, [1, 2]],
|
|
|
|
\ [0z00, [0]],
|
|
|
|
\ [0z, []],
|
|
|
|
\ [0z00000000, [0, 0, 0, 0]],
|
|
|
|
\ [0zAABB.CCDD, [170, 187, 204, 221]]]
|
|
|
|
for t in tests
|
|
|
|
call assert_equal(t[0]->blob2list(), t[1])
|
|
|
|
endfor
|
|
|
|
exe 'let v = 0z' .. repeat('000102030405060708090A0B0C0D0E0F', 64)
|
|
|
|
call assert_equal(1024, blob2list(v)->len())
|
|
|
|
call assert_equal([4, 8, 15], [v[100], v[1000], v[1023]])
|
|
|
|
call assert_equal([], blob2list(v:_null_blob))
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
" Tests for the list2blob() function
|
|
|
|
func Test_list2blob()
|
|
|
|
call assert_fails('let b = list2blob(0z10)', 'E1211: List required for argument 1')
|
|
|
|
let tests = [[[1, 2], 0z0102],
|
|
|
|
\ [[0], 0z00],
|
|
|
|
\ [[], 0z],
|
|
|
|
\ [[0, 0, 0, 0], 0z00000000],
|
2023-02-28 05:38:16 -07:00
|
|
|
\ [[255, 255], 0zFFFF],
|
2023-02-28 05:18:52 -07:00
|
|
|
\ [[170, 187, 204, 221], 0zAABB.CCDD],
|
|
|
|
\ ]
|
|
|
|
for t in tests
|
2023-02-28 05:38:16 -07:00
|
|
|
call assert_equal(t[1], t[0]->list2blob())
|
2023-02-28 05:18:52 -07:00
|
|
|
endfor
|
|
|
|
call assert_fails('let b = list2blob([1, []])', 'E745:')
|
|
|
|
call assert_fails('let b = list2blob([-1])', 'E1239:')
|
|
|
|
call assert_fails('let b = list2blob([256])', 'E1239:')
|
|
|
|
let b = range(16)->repeat(64)->list2blob()
|
|
|
|
call assert_equal(1024, b->len())
|
|
|
|
call assert_equal([4, 8, 15], [b[100], b[1000], b[1023]])
|
|
|
|
call assert_equal(0z, list2blob(v:_null_list))
|
|
|
|
endfunc
|
|
|
|
|
2021-12-19 12:49:03 -07:00
|
|
|
" The following used to cause an out-of-bounds memory access
|
|
|
|
func Test_blob2string()
|
|
|
|
let v = '0z' .. repeat('01010101.', 444)
|
|
|
|
let v ..= '01'
|
|
|
|
exe 'let b = ' .. v
|
|
|
|
call assert_equal(v, string(b))
|
|
|
|
endfunc
|
|
|
|
|
2023-02-28 06:07:56 -07:00
|
|
|
func Test_blob_repeat()
|
|
|
|
call assert_equal(0z, repeat(0z00, 0))
|
|
|
|
call assert_equal(0z00, repeat(0z00, 1))
|
|
|
|
call assert_equal(0z0000, repeat(0z00, 2))
|
|
|
|
call assert_equal(0z00000000, repeat(0z0000, 2))
|
|
|
|
|
|
|
|
call assert_equal(0z, repeat(0z12, 0))
|
|
|
|
call assert_equal(0z, repeat(0z1234, 0))
|
|
|
|
call assert_equal(0z1234, repeat(0z1234, 1))
|
|
|
|
call assert_equal(0z12341234, repeat(0z1234, 2))
|
|
|
|
endfunc
|
|
|
|
|
2023-02-28 06:01:36 -07:00
|
|
|
" Test for blob allocation failure
|
|
|
|
func Test_blob_alloc_failure()
|
|
|
|
CheckFunction test_alloc_fail
|
|
|
|
" blob variable
|
|
|
|
call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
|
|
|
|
call assert_fails('let v = 0z10', 'E342:')
|
|
|
|
|
|
|
|
" blob slice
|
|
|
|
let v = 0z1020
|
|
|
|
call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
|
|
|
|
call assert_fails('let x = v[0:0]', 'E342:')
|
|
|
|
call assert_equal(0z1020, x)
|
|
|
|
|
|
|
|
" blob remove()
|
|
|
|
let v = 0z10203040
|
|
|
|
call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
|
|
|
|
call assert_fails('let x = remove(v, 1, 2)', 'E342:')
|
|
|
|
call assert_equal(0, x)
|
|
|
|
|
|
|
|
" list2blob()
|
|
|
|
call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
|
|
|
|
call assert_fails('let a = list2blob([1, 2, 4])', 'E342:')
|
|
|
|
call assert_equal(0, a)
|
|
|
|
|
|
|
|
" mapnew()
|
|
|
|
call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
|
|
|
|
call assert_fails('let x = mapnew(0z1234, {_, v -> 1})', 'E342:')
|
|
|
|
call assert_equal(0, x)
|
|
|
|
|
|
|
|
" copy()
|
|
|
|
call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
|
|
|
|
call assert_fails('let x = copy(v)', 'E342:')
|
|
|
|
call assert_equal(0z, x)
|
|
|
|
|
|
|
|
" readblob()
|
|
|
|
call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
|
|
|
|
call assert_fails('let x = readblob("test_blob.vim")', 'E342:')
|
|
|
|
call assert_equal(0, x)
|
|
|
|
endfunc
|
|
|
|
|
2023-02-26 08:13:12 -07:00
|
|
|
" Test for the indexof() function
|
|
|
|
func Test_indexof()
|
|
|
|
let b = 0zdeadbeef
|
|
|
|
call assert_equal(0, indexof(b, {i, v -> v == 0xde}))
|
|
|
|
call assert_equal(3, indexof(b, {i, v -> v == 0xef}))
|
|
|
|
call assert_equal(-1, indexof(b, {i, v -> v == 0x1}))
|
|
|
|
call assert_equal(1, indexof(b, "v:val == 0xad"))
|
|
|
|
call assert_equal(-1, indexof(b, "v:val == 0xff"))
|
2023-02-26 09:00:01 -07:00
|
|
|
call assert_equal(-1, indexof(b, {_, v -> "v == 0xad"}))
|
2023-02-26 08:13:12 -07:00
|
|
|
|
|
|
|
call assert_equal(-1, indexof(0z, "v:val == 0x0"))
|
|
|
|
call assert_equal(-1, indexof(v:_null_blob, "v:val == 0xde"))
|
|
|
|
call assert_equal(-1, indexof(b, v:_null_string))
|
|
|
|
" Nvim doesn't have null functions
|
|
|
|
" call assert_equal(-1, indexof(b, test_null_function()))
|
|
|
|
|
|
|
|
let b = 0z01020102
|
|
|
|
call assert_equal(1, indexof(b, "v:val == 0x02", #{startidx: 0}))
|
|
|
|
call assert_equal(2, indexof(b, "v:val == 0x01", #{startidx: -2}))
|
|
|
|
call assert_equal(-1, indexof(b, "v:val == 0x01", #{startidx: 5}))
|
|
|
|
call assert_equal(0, indexof(b, "v:val == 0x01", #{startidx: -5}))
|
|
|
|
call assert_equal(0, indexof(b, "v:val == 0x01", v:_null_dict))
|
|
|
|
|
|
|
|
" failure cases
|
|
|
|
call assert_fails('let i = indexof(b, "val == 0xde")', 'E121:')
|
|
|
|
call assert_fails('let i = indexof(b, {})', 'E1256:')
|
|
|
|
endfunc
|
|
|
|
|
2020-11-17 20:11:00 -07:00
|
|
|
" vim: shiftwidth=2 sts=2 expandtab
|