blob: 79487efa543ced4e87b899d61289cc8e78b28f2b [file] [log] [blame]
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01001" Tests for the Blob types
2
Bram Moolenaar62aec932022-01-29 21:45:34 +00003import './vim9.vim' as v9
Bram Moolenaar68452172021-04-12 21:21:02 +02004
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +01005func TearDown()
6 " Run garbage collection after every test
7 call test_garbagecollect_now()
8endfunc
9
10" Tests for Blob type
11
12" Blob creation from constant
13func Test_blob_create()
Bram Moolenaar68452172021-04-12 21:21:02 +020014 let lines =<< trim END
15 VAR b = 0zDEADBEEF
16 call assert_equal(v:t_blob, type(b))
17 call assert_equal(4, len(b))
18 call assert_equal(0xDE, b[0])
19 call assert_equal(0xAD, b[1])
20 call assert_equal(0xBE, b[2])
21 call assert_equal(0xEF, b[3])
22 call assert_fails('VAR x = b[4]')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +010023
Bram Moolenaar68452172021-04-12 21:21:02 +020024 call assert_equal(0xDE, get(b, 0))
25 call assert_equal(0xEF, get(b, 3))
Bram Moolenaarc0f5a782019-01-13 15:16:13 +010026
Bram Moolenaar68452172021-04-12 21:21:02 +020027 call assert_fails('VAR b = 0z1', 'E973:')
28 call assert_fails('VAR b = 0z1x', 'E973:')
29 call assert_fails('VAR b = 0z12345', 'E973:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +010030
Bram Moolenaar68452172021-04-12 21:21:02 +020031 call assert_equal(0z, test_null_blob())
Bram Moolenaar4131fd52019-01-17 16:32:53 +010032
Bram Moolenaar68452172021-04-12 21:21:02 +020033 LET b = 0z001122.33445566.778899.aabbcc.dd
34 call assert_equal(0z00112233445566778899aabbccdd, b)
35 call assert_fails('VAR b = 0z1.1')
36 call assert_fails('VAR b = 0z.')
37 call assert_fails('VAR b = 0z001122.')
38 call assert_fails('call get("", 1)', 'E896:')
39 call assert_equal(0, len(test_null_blob()))
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +000040 call assert_equal(0z, copy(test_null_blob()))
Bram Moolenaar68452172021-04-12 21:21:02 +020041 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000042 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +010043endfunc
44
45" assignment to a blob
46func Test_blob_assign()
Bram Moolenaar68452172021-04-12 21:21:02 +020047 let lines =<< trim END
48 VAR b = 0zDEADBEEF
49 VAR b2 = b[1 : 2]
50 call assert_equal(0zADBE, b2)
51
52 VAR bcopy = b[:]
53 call assert_equal(b, bcopy)
54 call assert_false(b is bcopy)
55
56 LET b = 0zDEADBEEF
57 LET b2 = b
58 call assert_true(b is b2)
59 LET b[:] = 0z11223344
60 call assert_equal(0z11223344, b)
61 call assert_equal(0z11223344, b2)
62 call assert_true(b is b2)
63
64 LET b = 0zDEADBEEF
65 LET b[3 :] = 0z66
66 call assert_equal(0zDEADBE66, b)
67 LET b[: 1] = 0z8899
68 call assert_equal(0z8899BE66, b)
69
70 LET b = 0zDEADBEEF
71 LET b += 0z99
72 call assert_equal(0zDEADBEEF99, b)
73
74 VAR l = [0z12]
75 VAR m = deepcopy(l)
76 LET m[0] = 0z34 #" E742 or E741 should not occur.
77 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000078 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar68452172021-04-12 21:21:02 +020079
Bram Moolenaar0e3ff192021-04-14 20:35:23 +020080 let lines =<< trim END
81 VAR b = 0zDEADBEEF
82 LET b[2 : 3] = 0z112233
83 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000084 call v9.CheckLegacyAndVim9Failure(lines, 'E972:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +010085
Bram Moolenaar0e3ff192021-04-14 20:35:23 +020086 let lines =<< trim END
87 VAR b = 0zDEADBEEF
88 LET b[2 : 3] = 0z11
89 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000090 call v9.CheckLegacyAndVim9Failure(lines, 'E972:')
Bram Moolenaar0e3ff192021-04-14 20:35:23 +020091
92 let lines =<< trim END
93 VAR b = 0zDEADBEEF
94 LET b[3 : 2] = 0z
95 END
Bram Moolenaar62aec932022-01-29 21:45:34 +000096 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar0e3ff192021-04-14 20:35:23 +020097
98 let lines =<< trim END
99 VAR b = 0zDEADBEEF
Yegappan Lakshmanan9937d8b2024-05-08 20:24:33 +0200100 LET b[0 : 1] = 0x1122
101 END
102 call v9.CheckLegacyAndVim9Failure(lines, ['E709:', 'E1012:', 'E709:'])
103
104 let lines =<< trim END
105 VAR b = 0zDEADBEEF
106 LET b[0] = 0z11
107 END
108 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E974:', 'E1012:'])
109
110 let lines =<< trim END
111 VAR b = 0zDEADBEEF
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200112 LET b ..= 0z33
113 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000114 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:'])
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200115
116 let lines =<< trim END
117 VAR b = 0zDEADBEEF
118 LET b ..= "xx"
119 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000120 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:'])
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200121
122 let lines =<< trim END
123 VAR b = 0zDEADBEEF
124 LET b += "xx"
125 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000126 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200127
128 let lines =<< trim END
129 VAR b = 0zDEADBEEF
130 LET b[1 : 1] ..= 0z55
131 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000132 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1183:', 'E734:'])
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100133
134 call assert_fails('let b = readblob("a1b2c3")', 'E484:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100135endfunc
136
137func Test_blob_get_range()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200138 let lines =<< trim END
139 VAR b = 0z0011223344
140 call assert_equal(0z2233, b[2 : 3])
141 call assert_equal(0z223344, b[2 : -1])
142 call assert_equal(0z00, b[0 : -5])
143 call assert_equal(0z, b[0 : -11])
144 call assert_equal(0z44, b[-1 :])
145 call assert_equal(0z0011223344, b[:])
146 call assert_equal(0z0011223344, b[: -1])
147 call assert_equal(0z, b[5 : 6])
148 call assert_equal(0z0011, b[-10 : 1])
149 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000150 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200151
152 " legacy script white space
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100153 let b = 0z0011223344
154 call assert_equal(0z2233, b[2:3])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100155endfunc
156
Bram Moolenaar2ea773b2019-01-15 22:16:42 +0100157func Test_blob_get()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200158 let lines =<< trim END
159 VAR b = 0z0011223344
160 call assert_equal(0x00, get(b, 0))
161 call assert_equal(0x22, get(b, 2, 999))
162 call assert_equal(0x44, get(b, 4))
163 call assert_equal(0x44, get(b, -1))
164 call assert_equal(-1, get(b, 5))
165 call assert_equal(999, get(b, 5, 999))
166 call assert_equal(-1, get(b, -8))
167 call assert_equal(999, get(b, -8, 999))
168 call assert_equal(10, get(test_null_blob(), 2, 10))
Bram Moolenaara5be9b62019-01-24 12:31:44 +0100169
Bram Moolenaar51e93322021-04-17 20:44:56 +0200170 call assert_equal(0x00, b[0])
171 call assert_equal(0x22, b[2])
172 call assert_equal(0x44, b[4])
173 call assert_equal(0x44, b[-1])
174 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000175 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200176
177 let lines =<< trim END
178 VAR b = 0z0011223344
179 echo b[5]
180 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000181 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar51e93322021-04-17 20:44:56 +0200182
183 let lines =<< trim END
184 VAR b = 0z0011223344
185 echo b[-8]
186 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000187 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar2ea773b2019-01-15 22:16:42 +0100188endfunc
189
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100190func Test_blob_to_string()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200191 let lines =<< trim END
192 VAR b = 0z00112233445566778899aabbccdd
193 call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b))
194 call assert_equal(b, eval(string(b)))
195 call remove(b, 4, -1)
196 call assert_equal('0z00112233', string(b))
197 call remove(b, 0, 3)
198 call assert_equal('0z', string(b))
199 call assert_equal('0z', string(test_null_blob()))
200 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000201 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100202endfunc
203
204func Test_blob_compare()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200205 let lines =<< trim END
206 VAR b1 = 0z0011
207 VAR b2 = 0z1100
208 VAR b3 = 0z001122
209 call assert_true(b1 == b1)
210 call assert_false(b1 == b2)
211 call assert_false(b1 == b3)
212 call assert_true(b1 != b2)
213 call assert_true(b1 != b3)
214 call assert_true(b1 == 0z0011)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100215
Bram Moolenaar51e93322021-04-17 20:44:56 +0200216 call assert_false(b1 is b2)
217 LET b2 = b1
218 call assert_true(b1 == b2)
219 call assert_true(b1 is b2)
220 LET b2 = copy(b1)
221 call assert_true(b1 == b2)
222 call assert_false(b1 is b2)
223 LET b2 = b1[:]
224 call assert_true(b1 == b2)
225 call assert_false(b1 is b2)
226 call assert_true(b1 isnot b2)
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100227 call assert_true(0z != 0z10)
228 call assert_true(0z10 != 0z)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200229 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000230 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100231
Bram Moolenaar51e93322021-04-17 20:44:56 +0200232 let lines =<< trim END
233 VAR b1 = 0z0011
234 echo b1 == 9
235 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000236 call v9.CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200237
238 let lines =<< trim END
239 VAR b1 = 0z0011
240 echo b1 != 9
241 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000242 call v9.CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200243
244 let lines =<< trim END
245 VAR b1 = 0z0011
246 VAR b2 = 0z1100
247 VAR x = b1 > b2
248 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000249 call v9.CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200250
251 let lines =<< trim END
252 VAR b1 = 0z0011
253 VAR b2 = 0z1100
254 VAR x = b1 < b2
255 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000256 call v9.CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200257
258 let lines =<< trim END
259 VAR b1 = 0z0011
260 VAR b2 = 0z1100
261 VAR x = b1 - b2
262 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000263 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200264
265 let lines =<< trim END
266 VAR b1 = 0z0011
267 VAR b2 = 0z1100
268 VAR x = b1 / b2
269 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000270 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200271
272 let lines =<< trim END
273 VAR b1 = 0z0011
274 VAR b2 = 0z1100
275 VAR x = b1 * b2
276 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000277 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100278endfunc
279
Bram Moolenaar51e93322021-04-17 20:44:56 +0200280func Test_blob_index_assign()
281 let lines =<< trim END
282 VAR b = 0z00
283 LET b[1] = 0x11
284 LET b[2] = 0x22
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100285 LET b[0] = 0x33
286 call assert_equal(0z331122, b)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200287 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000288 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200289
290 let lines =<< trim END
291 VAR b = 0z00
292 LET b[2] = 0x33
293 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000294 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar51e93322021-04-17 20:44:56 +0200295
296 let lines =<< trim END
297 VAR b = 0z00
298 LET b[-2] = 0x33
299 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000300 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100301
302 let lines =<< trim END
303 VAR b = 0z00010203
304 LET b[0 : -1] = 0z33
305 END
306 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
307
308 let lines =<< trim END
309 VAR b = 0z00010203
310 LET b[3 : 4] = 0z3344
311 END
312 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100313endfunc
314
315func Test_blob_for_loop()
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200316 let lines =<< trim END
317 VAR blob = 0z00010203
318 VAR i = 0
319 for byte in blob
320 call assert_equal(i, byte)
321 LET i += 1
322 endfor
323 call assert_equal(4, i)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100324
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200325 LET blob = 0z00
Bram Moolenaardd29ea12019-01-23 21:56:21 +0100326 call remove(blob, 0)
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200327 call assert_equal(0, len(blob))
328 for byte in blob
329 call assert_report('loop over empty blob')
330 endfor
331
332 LET blob = 0z0001020304
333 LET i = 0
334 for byte in blob
335 call assert_equal(i, byte)
336 if i == 1
337 call remove(blob, 0)
338 elseif i == 3
339 call remove(blob, 3)
340 endif
341 LET i += 1
342 endfor
343 call assert_equal(5, i)
344 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000345 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100346endfunc
347
348func Test_blob_concatenate()
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200349 let lines =<< trim END
350 VAR b = 0z0011
351 LET b += 0z2233
352 call assert_equal(0z00112233, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100353
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200354 LET b = 0zDEAD + 0zBEEF
355 call assert_equal(0zDEADBEEF, b)
356 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000357 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100358
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200359 let lines =<< trim END
360 VAR b = 0z0011
361 LET b += "a"
362 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000363 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200364
365 let lines =<< trim END
366 VAR b = 0z0011
367 LET b += 88
368 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000369 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100370endfunc
371
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100372func Test_blob_add()
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200373 let lines =<< trim END
374 VAR b = 0z0011
375 call add(b, 0x22)
376 call assert_equal(0z001122, b)
377 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000378 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200379
380 " Only works in legacy script
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100381 let b = 0z0011
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100382 call add(b, '51')
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200383 call assert_equal(0z001133, b)
Bram Moolenaarea04a6e2020-04-23 13:38:02 +0200384 call assert_equal(1, add(test_null_blob(), 0x22))
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100385
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200386 let lines =<< trim END
387 VAR b = 0z0011
388 call add(b, [9])
389 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000390 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1012:', 'E1210:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200391
392 let lines =<< trim END
393 VAR b = 0z0011
394 call add("", 0x01)
395 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000396 call v9.CheckLegacyAndVim9Failure(lines, ['E897:', 'E1013:', 'E1226:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200397
398 let lines =<< trim END
399 add(test_null_blob(), 0x22)
400 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000401 call v9.CheckDefExecAndScriptFailure(lines, 'E1131:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000402
403 let lines =<< trim END
404 let b = 0zDEADBEEF
405 lockvar b
406 call add(b, 0)
407 unlockvar b
408 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000409 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100410endfunc
411
412func Test_blob_empty()
413 call assert_false(empty(0z001122))
414 call assert_true(empty(0z))
415 call assert_true(empty(test_null_blob()))
416endfunc
417
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100418" Test removing items in blob
419func Test_blob_func_remove()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200420 let lines =<< trim END
421 #" Test removing 1 element
422 VAR b = 0zDEADBEEF
423 call assert_equal(0xDE, remove(b, 0))
424 call assert_equal(0zADBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100425
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200426 LET b = 0zDEADBEEF
427 call assert_equal(0xEF, remove(b, -1))
428 call assert_equal(0zDEADBE, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100429
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200430 LET b = 0zDEADBEEF
431 call assert_equal(0xAD, remove(b, 1))
432 call assert_equal(0zDEBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100433
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200434 #" Test removing range of element(s)
435 LET b = 0zDEADBEEF
436 call assert_equal(0zBE, remove(b, 2, 2))
437 call assert_equal(0zDEADEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100438
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200439 LET b = 0zDEADBEEF
440 call assert_equal(0zADBE, remove(b, 1, 2))
441 call assert_equal(0zDEEF, b)
442 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000443 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100444
445 " Test invalid cases
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200446 let lines =<< trim END
447 VAR b = 0zDEADBEEF
448 call remove(b, 5)
449 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000450 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200451
452 let lines =<< trim END
453 VAR b = 0zDEADBEEF
454 call remove(b, 1, 5)
455 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000456 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200457
458 let lines =<< trim END
459 VAR b = 0zDEADBEEF
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100460 call remove(b, -10)
461 END
462 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
463
464 let lines =<< trim END
465 VAR b = 0zDEADBEEF
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200466 call remove(b, 3, 2)
467 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000468 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200469
470 let lines =<< trim END
471 VAR b = 0zDEADBEEF
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200472 call remove(test_null_blob(), 1, 2)
473 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000474 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Sean Dewar80d73952021-08-04 19:25:54 +0200475
476 let lines =<< trim END
477 let b = 0zDEADBEEF
478 lockvar b
479 call remove(b, 0)
480 unlockvar b
481 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000482 call v9.CheckScriptFailure(lines, 'E741:')
Sean Dewar80d73952021-08-04 19:25:54 +0200483
484 " can only check at script level, not in a :def function
485 let lines =<< trim END
486 vim9script
487 var b = 0zDEADBEEF
488 lockvar b
489 remove(b, 0)
490 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000491 call v9.CheckScriptFailure(lines, 'E741:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000492
493 call assert_fails('echo remove(0z1020, [])', 'E745:')
494 call assert_fails('echo remove(0z1020, 0, [])', 'E745:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100495endfunc
496
497func Test_blob_read_write()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200498 let lines =<< trim END
499 VAR b = 0zDEADBEEF
500 call writefile(b, 'Xblob')
501 VAR br = readfile('Xblob', 'B')
502 call assert_equal(b, br)
K.Takata11df3ae2022-10-19 14:02:40 +0100503 VAR br2 = readblob('Xblob')
504 call assert_equal(b, br2)
505 VAR br3 = readblob('Xblob', 1)
506 call assert_equal(b[1 :], br3)
507 VAR br4 = readblob('Xblob', 1, 2)
508 call assert_equal(b[1 : 2], br4)
509 VAR br5 = readblob('Xblob', -3)
510 call assert_equal(b[-3 :], br5)
511 VAR br6 = readblob('Xblob', -3, 2)
512 call assert_equal(b[-3 : -2], br6)
Bram Moolenaar94722c52023-01-28 19:19:03 +0000513
Bram Moolenaar5b2a3d72022-10-21 11:25:30 +0100514 #" reading past end of file, empty result
K.Takata11df3ae2022-10-19 14:02:40 +0100515 VAR br1e = readblob('Xblob', 10000)
516 call assert_equal(0z, br1e)
Bram Moolenaar5b2a3d72022-10-21 11:25:30 +0100517
518 #" reading too much, result is truncated
519 VAR blong = readblob('Xblob', -1000)
520 call assert_equal(b, blong)
521 LET blong = readblob('Xblob', -10, 8)
522 call assert_equal(b, blong)
523 LET blong = readblob('Xblob', 0, 10)
524 call assert_equal(b, blong)
K.Takata11df3ae2022-10-19 14:02:40 +0100525
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200526 call delete('Xblob')
527 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000528 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar15352dc2020-04-06 21:12:42 +0200529
K.Takata43625762022-10-20 13:28:51 +0100530 if filereadable('/dev/random')
531 let b = readblob('/dev/random', 0, 10)
532 call assert_equal(10, len(b))
533 endif
534
K.Takata11df3ae2022-10-19 14:02:40 +0100535 call assert_fails("call readblob('notexist')", 'E484:')
536 " TODO: How do we test for the E485 error?
537
Bram Moolenaar15352dc2020-04-06 21:12:42 +0200538 " This was crashing when calling readfile() with a directory.
539 call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100540endfunc
541
542" filter() item in blob
543func Test_blob_filter()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200544 let lines =<< trim END
545 call assert_equal(test_null_blob(), filter(test_null_blob(), '0'))
546 call assert_equal(0z, filter(0zDEADBEEF, '0'))
547 call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
548 call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE'))
549 call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF'))
550 call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
551 call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
552 call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
553 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000554 call v9.CheckLegacyAndVim9Success(lines)
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000555 call assert_fails('echo filter(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100556endfunc
557
558" map() item in blob
559func Test_blob_map()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200560 let lines =<< trim END
561 call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
562 call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
563 call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
564 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000565 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100566
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200567 let lines =<< trim END
568 call map(0z00, '[9]')
569 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000570 call v9.CheckLegacyAndVim9Failure(lines, 'E978:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000571 call assert_fails('echo map(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100572endfunc
573
574func Test_blob_index()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200575 let lines =<< trim END
576 call assert_equal(2, index(0zDEADBEEF, 0xBE))
577 call assert_equal(-1, index(0zDEADBEEF, 0))
578 call assert_equal(2, index(0z11111111, 0x11, 2))
579 call assert_equal(3, 0z11110111->index(0x11, 2))
580 call assert_equal(2, index(0z11111111, 0x11, -2))
581 call assert_equal(3, index(0z11110111, 0x11, -2))
582 call assert_equal(0, index(0z11110111, 0x11, -10))
583 call assert_equal(-1, index(test_null_blob(), 1))
584 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000585 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100586endfunc
587
588func Test_blob_insert()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200589 let lines =<< trim END
590 VAR b = 0zDEADBEEF
591 call insert(b, 0x33)
592 call assert_equal(0z33DEADBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100593
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200594 LET b = 0zDEADBEEF
595 call insert(b, 0x33, 2)
596 call assert_equal(0zDEAD33BEEF, b)
597 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000598 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100599
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200600 " only works in legacy script
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200601 call assert_equal(0, insert(test_null_blob(), 0x33))
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200602
603 let lines =<< trim END
604 VAR b = 0zDEADBEEF
605 call insert(b, -1)
606 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000607 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200608
609 let lines =<< trim END
610 VAR b = 0zDEADBEEF
611 call insert(b, 257)
612 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000613 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200614
615 let lines =<< trim END
616 VAR b = 0zDEADBEEF
617 call insert(b, 0, [9])
618 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000619 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200620
621 let lines =<< trim END
622 VAR b = 0zDEADBEEF
623 call insert(b, 0, -20)
624 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000625 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200626
627 let lines =<< trim END
628 VAR b = 0zDEADBEEF
629 call insert(b, 0, 20)
630 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000631 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200632
633 let lines =<< trim END
634 VAR b = 0zDEADBEEF
635 call insert(b, [])
636 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000637 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200638
639 let lines =<< trim END
640 insert(test_null_blob(), 0x33)
641 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000642 call v9.CheckDefExecAndScriptFailure(lines, 'E1131:')
Sean Dewar80d73952021-08-04 19:25:54 +0200643
644 let lines =<< trim END
645 let b = 0zDEADBEEF
646 lockvar b
647 call insert(b, 3)
648 unlockvar b
649 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000650 call v9.CheckScriptFailure(lines, 'E741:')
Sean Dewar80d73952021-08-04 19:25:54 +0200651
652 let lines =<< trim END
653 vim9script
654 var b = 0zDEADBEEF
655 lockvar b
656 insert(b, 3)
657 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000658 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100659endfunc
660
661func Test_blob_reverse()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200662 let lines =<< trim END
663 call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF))
664 call assert_equal(0zBEADDE, reverse(0zDEADBE))
665 call assert_equal(0zADDE, reverse(0zDEAD))
666 call assert_equal(0zDE, reverse(0zDE))
667 call assert_equal(0z, reverse(test_null_blob()))
668 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000669 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100670endfunc
671
672func Test_blob_json_encode()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200673 let lines =<< trim END
674 call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF))
675 call assert_equal('[]', json_encode(0z))
676 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000677 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100678endfunc
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100679
680func Test_blob_lock()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200681 let lines =<< trim END
682 let b = 0z112233
683 lockvar b
684 unlockvar b
685 let b = 0z44
686 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000687 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200688
689 let lines =<< trim END
690 vim9script
691 var b = 0z112233
692 lockvar b
693 unlockvar b
694 b = 0z44
695 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000696 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200697
698 let lines =<< trim END
699 let b = 0z112233
700 lockvar b
701 let b = 0z44
702 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000703 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200704
705 let lines =<< trim END
706 vim9script
707 var b = 0z112233
708 lockvar b
709 b = 0z44
710 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000711 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100712endfunc
713
714func Test_blob_sort()
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100715 call v9.CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000716 call v9.CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100717endfunc
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100718
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200719" Tests for the blob2list() function
720func Test_blob2list()
721 call assert_fails('let v = blob2list(10)', 'E1238: Blob required for argument 1')
722 eval 0zFFFF->blob2list()->assert_equal([255, 255])
723 let tests = [[0z0102, [1, 2]],
724 \ [0z00, [0]],
725 \ [0z, []],
726 \ [0z00000000, [0, 0, 0, 0]],
727 \ [0zAABB.CCDD, [170, 187, 204, 221]]]
728 for t in tests
729 call assert_equal(t[0]->blob2list(), t[1])
730 endfor
731 exe 'let v = 0z' .. repeat('000102030405060708090A0B0C0D0E0F', 64)
732 call assert_equal(1024, blob2list(v)->len())
733 call assert_equal([4, 8, 15], [v[100], v[1000], v[1023]])
734 call assert_equal([], blob2list(test_null_blob()))
735endfunc
736
737" Tests for the list2blob() function
738func Test_list2blob()
739 call assert_fails('let b = list2blob(0z10)', 'E1211: List required for argument 1')
740 let tests = [[[1, 2], 0z0102],
741 \ [[0], 0z00],
742 \ [[], 0z],
743 \ [[0, 0, 0, 0], 0z00000000],
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200744 \ [[255, 255], 0zFFFF],
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200745 \ [[170, 187, 204, 221], 0zAABB.CCDD],
746 \ ]
747 for t in tests
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200748 call assert_equal(t[1], t[0]->list2blob())
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200749 endfor
750 call assert_fails('let b = list2blob([1, []])', 'E745:')
751 call assert_fails('let b = list2blob([-1])', 'E1239:')
752 call assert_fails('let b = list2blob([256])', 'E1239:')
753 let b = range(16)->repeat(64)->list2blob()
754 call assert_equal(1024, b->len())
755 call assert_equal([4, 8, 15], [b[100], b[1000], b[1023]])
kuuote04b7b4b2021-12-03 13:57:00 +0000756
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200757 call assert_equal(0z, list2blob(test_null_list()))
kuuote04b7b4b2021-12-03 13:57:00 +0000758 call assert_equal(0z00010203, list2blob(range(4)))
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200759endfunc
760
Yegappan Lakshmananbc404bf2021-12-19 19:19:31 +0000761" The following used to cause an out-of-bounds memory access
762func Test_blob2string()
763 let v = '0z' .. repeat('01010101.', 444)
764 let v ..= '01'
765 exe 'let b = ' .. v
766 call assert_equal(v, string(b))
767endfunc
kuuote04b7b4b2021-12-03 13:57:00 +0000768
Bakudankun375141e2022-09-09 18:46:47 +0100769func Test_blob_repeat()
770 call assert_equal(0z, repeat(0z00, 0))
771 call assert_equal(0z00, repeat(0z00, 1))
772 call assert_equal(0z0000, repeat(0z00, 2))
773 call assert_equal(0z00000000, repeat(0z0000, 2))
774
775 call assert_equal(0z, repeat(0z12, 0))
776 call assert_equal(0z, repeat(0z1234, 0))
777 call assert_equal(0z1234, repeat(0z1234, 1))
778 call assert_equal(0z12341234, repeat(0z1234, 2))
779endfunc
780
Yegappan Lakshmanan72bb47e2022-04-03 11:22:38 +0100781" Test for blob allocation failure
782func Test_blob_alloc_failure()
783 " blob variable
784 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
785 call assert_fails('let v = 0z10', 'E342:')
786
787 " blob slice
788 let v = 0z1020
789 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
790 call assert_fails('let x = v[0:0]', 'E342:')
791 call assert_equal(0z1020, x)
792
793 " blob remove()
794 let v = 0z10203040
795 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
796 call assert_fails('let x = remove(v, 1, 2)', 'E342:')
797 call assert_equal(0, x)
798
799 " list2blob()
800 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
801 call assert_fails('let a = list2blob([1, 2, 4])', 'E342:')
802 call assert_equal(0, a)
803
804 " mapnew()
805 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
806 call assert_fails('let x = mapnew(0z1234, {_, v -> 1})', 'E342:')
807 call assert_equal(0, x)
808
809 " copy()
810 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
811 call assert_fails('let x = copy(v)', 'E342:')
812 call assert_equal(0z, x)
813
814 " readblob()
815 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
816 call assert_fails('let x = readblob("test_blob.vim")', 'E342:')
817 call assert_equal(0, x)
818endfunc
819
Yegappan Lakshmananb2186552022-08-13 13:09:20 +0100820" Test for the indexof() function
821func Test_indexof()
822 let b = 0zdeadbeef
823 call assert_equal(0, indexof(b, {i, v -> v == 0xde}))
824 call assert_equal(3, indexof(b, {i, v -> v == 0xef}))
825 call assert_equal(-1, indexof(b, {i, v -> v == 0x1}))
826 call assert_equal(1, indexof(b, "v:val == 0xad"))
827 call assert_equal(-1, indexof(b, "v:val == 0xff"))
Yegappan Lakshmanan63acae12022-08-14 12:07:11 +0100828 call assert_equal(-1, indexof(b, {_, v -> "v == 0xad"}))
Yegappan Lakshmananb2186552022-08-13 13:09:20 +0100829
830 call assert_equal(-1, indexof(0z, "v:val == 0x0"))
831 call assert_equal(-1, indexof(test_null_blob(), "v:val == 0xde"))
832 call assert_equal(-1, indexof(b, test_null_string()))
833 call assert_equal(-1, indexof(b, test_null_function()))
834
835 let b = 0z01020102
836 call assert_equal(1, indexof(b, "v:val == 0x02", #{startidx: 0}))
837 call assert_equal(2, indexof(b, "v:val == 0x01", #{startidx: -2}))
838 call assert_equal(-1, indexof(b, "v:val == 0x01", #{startidx: 5}))
839 call assert_equal(0, indexof(b, "v:val == 0x01", #{startidx: -5}))
840 call assert_equal(0, indexof(b, "v:val == 0x01", test_null_dict()))
841
842 " failure cases
843 call assert_fails('let i = indexof(b, "val == 0xde")', 'E121:')
844 call assert_fails('let i = indexof(b, {})', 'E1256:')
845endfunc
846
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100847" vim: shiftwidth=2 sts=2 expandtab