blob: 47315ab84fbfcbac1c8ad5ef024c416d3bb95d29 [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
100 LET b ..= 0z33
101 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000102 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:'])
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200103
104 let lines =<< trim END
105 VAR b = 0zDEADBEEF
106 LET b ..= "xx"
107 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000108 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1019:', 'E734:'])
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200109
110 let lines =<< trim END
111 VAR b = 0zDEADBEEF
112 LET b += "xx"
113 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000114 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
Bram Moolenaar0e3ff192021-04-14 20:35:23 +0200115
116 let lines =<< trim END
117 VAR b = 0zDEADBEEF
118 LET b[1 : 1] ..= 0z55
119 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000120 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1183:', 'E734:'])
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100121
122 call assert_fails('let b = readblob("a1b2c3")', 'E484:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100123endfunc
124
125func Test_blob_get_range()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200126 let lines =<< trim END
127 VAR b = 0z0011223344
128 call assert_equal(0z2233, b[2 : 3])
129 call assert_equal(0z223344, b[2 : -1])
130 call assert_equal(0z00, b[0 : -5])
131 call assert_equal(0z, b[0 : -11])
132 call assert_equal(0z44, b[-1 :])
133 call assert_equal(0z0011223344, b[:])
134 call assert_equal(0z0011223344, b[: -1])
135 call assert_equal(0z, b[5 : 6])
136 call assert_equal(0z0011, b[-10 : 1])
137 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000138 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200139
140 " legacy script white space
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100141 let b = 0z0011223344
142 call assert_equal(0z2233, b[2:3])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100143endfunc
144
Bram Moolenaar2ea773b2019-01-15 22:16:42 +0100145func Test_blob_get()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200146 let lines =<< trim END
147 VAR b = 0z0011223344
148 call assert_equal(0x00, get(b, 0))
149 call assert_equal(0x22, get(b, 2, 999))
150 call assert_equal(0x44, get(b, 4))
151 call assert_equal(0x44, get(b, -1))
152 call assert_equal(-1, get(b, 5))
153 call assert_equal(999, get(b, 5, 999))
154 call assert_equal(-1, get(b, -8))
155 call assert_equal(999, get(b, -8, 999))
156 call assert_equal(10, get(test_null_blob(), 2, 10))
Bram Moolenaara5be9b62019-01-24 12:31:44 +0100157
Bram Moolenaar51e93322021-04-17 20:44:56 +0200158 call assert_equal(0x00, b[0])
159 call assert_equal(0x22, b[2])
160 call assert_equal(0x44, b[4])
161 call assert_equal(0x44, b[-1])
162 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000163 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200164
165 let lines =<< trim END
166 VAR b = 0z0011223344
167 echo b[5]
168 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000169 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar51e93322021-04-17 20:44:56 +0200170
171 let lines =<< trim END
172 VAR b = 0z0011223344
173 echo b[-8]
174 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000175 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar2ea773b2019-01-15 22:16:42 +0100176endfunc
177
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100178func Test_blob_to_string()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200179 let lines =<< trim END
180 VAR b = 0z00112233445566778899aabbccdd
181 call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b))
182 call assert_equal(b, eval(string(b)))
183 call remove(b, 4, -1)
184 call assert_equal('0z00112233', string(b))
185 call remove(b, 0, 3)
186 call assert_equal('0z', string(b))
187 call assert_equal('0z', string(test_null_blob()))
188 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000189 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100190endfunc
191
192func Test_blob_compare()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200193 let lines =<< trim END
194 VAR b1 = 0z0011
195 VAR b2 = 0z1100
196 VAR b3 = 0z001122
197 call assert_true(b1 == b1)
198 call assert_false(b1 == b2)
199 call assert_false(b1 == b3)
200 call assert_true(b1 != b2)
201 call assert_true(b1 != b3)
202 call assert_true(b1 == 0z0011)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100203
Bram Moolenaar51e93322021-04-17 20:44:56 +0200204 call assert_false(b1 is b2)
205 LET b2 = b1
206 call assert_true(b1 == b2)
207 call assert_true(b1 is b2)
208 LET b2 = copy(b1)
209 call assert_true(b1 == b2)
210 call assert_false(b1 is b2)
211 LET b2 = b1[:]
212 call assert_true(b1 == b2)
213 call assert_false(b1 is b2)
214 call assert_true(b1 isnot b2)
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100215 call assert_true(0z != 0z10)
216 call assert_true(0z10 != 0z)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200217 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000218 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100219
Bram Moolenaar51e93322021-04-17 20:44:56 +0200220 let lines =<< trim END
221 VAR b1 = 0z0011
222 echo b1 == 9
223 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000224 call v9.CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200225
226 let lines =<< trim END
227 VAR b1 = 0z0011
228 echo b1 != 9
229 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000230 call v9.CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200231
232 let lines =<< trim END
233 VAR b1 = 0z0011
234 VAR b2 = 0z1100
235 VAR x = b1 > b2
236 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000237 call v9.CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200238
239 let lines =<< trim END
240 VAR b1 = 0z0011
241 VAR b2 = 0z1100
242 VAR x = b1 < b2
243 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000244 call v9.CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200245
246 let lines =<< trim END
247 VAR b1 = 0z0011
248 VAR b2 = 0z1100
249 VAR x = b1 - b2
250 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000251 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200252
253 let lines =<< trim END
254 VAR b1 = 0z0011
255 VAR b2 = 0z1100
256 VAR x = b1 / b2
257 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000258 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200259
260 let lines =<< trim END
261 VAR b1 = 0z0011
262 VAR b2 = 0z1100
263 VAR x = b1 * b2
264 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000265 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100266endfunc
267
Bram Moolenaar51e93322021-04-17 20:44:56 +0200268func Test_blob_index_assign()
269 let lines =<< trim END
270 VAR b = 0z00
271 LET b[1] = 0x11
272 LET b[2] = 0x22
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100273 LET b[0] = 0x33
274 call assert_equal(0z331122, b)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200275 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000276 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200277
278 let lines =<< trim END
279 VAR b = 0z00
280 LET b[2] = 0x33
281 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000282 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar51e93322021-04-17 20:44:56 +0200283
284 let lines =<< trim END
285 VAR b = 0z00
286 LET b[-2] = 0x33
287 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000288 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100289
290 let lines =<< trim END
291 VAR b = 0z00010203
292 LET b[0 : -1] = 0z33
293 END
294 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
295
296 let lines =<< trim END
297 VAR b = 0z00010203
298 LET b[3 : 4] = 0z3344
299 END
300 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100301endfunc
302
303func Test_blob_for_loop()
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200304 let lines =<< trim END
305 VAR blob = 0z00010203
306 VAR i = 0
307 for byte in blob
308 call assert_equal(i, byte)
309 LET i += 1
310 endfor
311 call assert_equal(4, i)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100312
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200313 LET blob = 0z00
Bram Moolenaardd29ea12019-01-23 21:56:21 +0100314 call remove(blob, 0)
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200315 call assert_equal(0, len(blob))
316 for byte in blob
317 call assert_report('loop over empty blob')
318 endfor
319
320 LET blob = 0z0001020304
321 LET i = 0
322 for byte in blob
323 call assert_equal(i, byte)
324 if i == 1
325 call remove(blob, 0)
326 elseif i == 3
327 call remove(blob, 3)
328 endif
329 LET i += 1
330 endfor
331 call assert_equal(5, i)
332 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000333 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100334endfunc
335
336func Test_blob_concatenate()
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200337 let lines =<< trim END
338 VAR b = 0z0011
339 LET b += 0z2233
340 call assert_equal(0z00112233, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100341
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200342 LET b = 0zDEAD + 0zBEEF
343 call assert_equal(0zDEADBEEF, b)
344 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000345 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100346
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200347 let lines =<< trim END
348 VAR b = 0z0011
349 LET b += "a"
350 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000351 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200352
353 let lines =<< trim END
354 VAR b = 0z0011
355 LET b += 88
356 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000357 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100358endfunc
359
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100360func Test_blob_add()
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200361 let lines =<< trim END
362 VAR b = 0z0011
363 call add(b, 0x22)
364 call assert_equal(0z001122, b)
365 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000366 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200367
368 " Only works in legacy script
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100369 let b = 0z0011
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100370 call add(b, '51')
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200371 call assert_equal(0z001133, b)
Bram Moolenaarea04a6e2020-04-23 13:38:02 +0200372 call assert_equal(1, add(test_null_blob(), 0x22))
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100373
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200374 let lines =<< trim END
375 VAR b = 0z0011
376 call add(b, [9])
377 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000378 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1012:', 'E1210:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200379
380 let lines =<< trim END
381 VAR b = 0z0011
382 call add("", 0x01)
383 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000384 call v9.CheckLegacyAndVim9Failure(lines, ['E897:', 'E1013:', 'E1226:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200385
386 let lines =<< trim END
387 add(test_null_blob(), 0x22)
388 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000389 call v9.CheckDefExecAndScriptFailure(lines, 'E1131:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000390
391 let lines =<< trim END
392 let b = 0zDEADBEEF
393 lockvar b
394 call add(b, 0)
395 unlockvar b
396 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000397 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100398endfunc
399
400func Test_blob_empty()
401 call assert_false(empty(0z001122))
402 call assert_true(empty(0z))
403 call assert_true(empty(test_null_blob()))
404endfunc
405
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100406" Test removing items in blob
407func Test_blob_func_remove()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200408 let lines =<< trim END
409 #" Test removing 1 element
410 VAR b = 0zDEADBEEF
411 call assert_equal(0xDE, remove(b, 0))
412 call assert_equal(0zADBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100413
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200414 LET b = 0zDEADBEEF
415 call assert_equal(0xEF, remove(b, -1))
416 call assert_equal(0zDEADBE, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100417
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200418 LET b = 0zDEADBEEF
419 call assert_equal(0xAD, remove(b, 1))
420 call assert_equal(0zDEBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100421
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200422 #" Test removing range of element(s)
423 LET b = 0zDEADBEEF
424 call assert_equal(0zBE, remove(b, 2, 2))
425 call assert_equal(0zDEADEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100426
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200427 LET b = 0zDEADBEEF
428 call assert_equal(0zADBE, remove(b, 1, 2))
429 call assert_equal(0zDEEF, b)
430 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000431 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100432
433 " Test invalid cases
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200434 let lines =<< trim END
435 VAR b = 0zDEADBEEF
436 call remove(b, 5)
437 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000438 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200439
440 let lines =<< trim END
441 VAR b = 0zDEADBEEF
442 call remove(b, 1, 5)
443 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000444 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200445
446 let lines =<< trim END
447 VAR b = 0zDEADBEEF
Yegappan Lakshmanan885de442022-04-23 10:51:14 +0100448 call remove(b, -10)
449 END
450 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
451
452 let lines =<< trim END
453 VAR b = 0zDEADBEEF
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200454 call remove(b, 3, 2)
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
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200460 call remove(test_null_blob(), 1, 2)
461 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000462 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Sean Dewar80d73952021-08-04 19:25:54 +0200463
464 let lines =<< trim END
465 let b = 0zDEADBEEF
466 lockvar b
467 call remove(b, 0)
468 unlockvar b
469 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000470 call v9.CheckScriptFailure(lines, 'E741:')
Sean Dewar80d73952021-08-04 19:25:54 +0200471
472 " can only check at script level, not in a :def function
473 let lines =<< trim END
474 vim9script
475 var b = 0zDEADBEEF
476 lockvar b
477 remove(b, 0)
478 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000479 call v9.CheckScriptFailure(lines, 'E741:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000480
481 call assert_fails('echo remove(0z1020, [])', 'E745:')
482 call assert_fails('echo remove(0z1020, 0, [])', 'E745:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100483endfunc
484
485func Test_blob_read_write()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200486 let lines =<< trim END
487 VAR b = 0zDEADBEEF
488 call writefile(b, 'Xblob')
489 VAR br = readfile('Xblob', 'B')
490 call assert_equal(b, br)
K.Takata11df3ae2022-10-19 14:02:40 +0100491 VAR br2 = readblob('Xblob')
492 call assert_equal(b, br2)
493 VAR br3 = readblob('Xblob', 1)
494 call assert_equal(b[1 :], br3)
495 VAR br4 = readblob('Xblob', 1, 2)
496 call assert_equal(b[1 : 2], br4)
497 VAR br5 = readblob('Xblob', -3)
498 call assert_equal(b[-3 :], br5)
499 VAR br6 = readblob('Xblob', -3, 2)
500 call assert_equal(b[-3 : -2], br6)
501
502 VAR br1e = readblob('Xblob', 10000)
503 call assert_equal(0z, br1e)
504 VAR br2e = readblob('Xblob', -10000)
505 call assert_equal(0z, br2e)
506
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200507 call delete('Xblob')
508 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000509 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar15352dc2020-04-06 21:12:42 +0200510
K.Takata43625762022-10-20 13:28:51 +0100511 if filereadable('/dev/random')
512 let b = readblob('/dev/random', 0, 10)
513 call assert_equal(10, len(b))
514 endif
515
K.Takata11df3ae2022-10-19 14:02:40 +0100516 call assert_fails("call readblob('notexist')", 'E484:')
517 " TODO: How do we test for the E485 error?
518
Bram Moolenaar15352dc2020-04-06 21:12:42 +0200519 " This was crashing when calling readfile() with a directory.
520 call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100521endfunc
522
523" filter() item in blob
524func Test_blob_filter()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200525 let lines =<< trim END
526 call assert_equal(test_null_blob(), filter(test_null_blob(), '0'))
527 call assert_equal(0z, filter(0zDEADBEEF, '0'))
528 call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
529 call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE'))
530 call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF'))
531 call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
532 call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
533 call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
534 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000535 call v9.CheckLegacyAndVim9Success(lines)
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000536 call assert_fails('echo filter(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100537endfunc
538
539" map() item in blob
540func Test_blob_map()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200541 let lines =<< trim END
542 call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
543 call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
544 call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
545 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000546 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100547
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200548 let lines =<< trim END
549 call map(0z00, '[9]')
550 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000551 call v9.CheckLegacyAndVim9Failure(lines, 'E978:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000552 call assert_fails('echo map(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100553endfunc
554
555func Test_blob_index()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200556 let lines =<< trim END
557 call assert_equal(2, index(0zDEADBEEF, 0xBE))
558 call assert_equal(-1, index(0zDEADBEEF, 0))
559 call assert_equal(2, index(0z11111111, 0x11, 2))
560 call assert_equal(3, 0z11110111->index(0x11, 2))
561 call assert_equal(2, index(0z11111111, 0x11, -2))
562 call assert_equal(3, index(0z11110111, 0x11, -2))
563 call assert_equal(0, index(0z11110111, 0x11, -10))
564 call assert_equal(-1, index(test_null_blob(), 1))
565 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000566 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100567endfunc
568
569func Test_blob_insert()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200570 let lines =<< trim END
571 VAR b = 0zDEADBEEF
572 call insert(b, 0x33)
573 call assert_equal(0z33DEADBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100574
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200575 LET b = 0zDEADBEEF
576 call insert(b, 0x33, 2)
577 call assert_equal(0zDEAD33BEEF, b)
578 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000579 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100580
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200581 " only works in legacy script
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200582 call assert_equal(0, insert(test_null_blob(), 0x33))
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200583
584 let lines =<< trim END
585 VAR b = 0zDEADBEEF
586 call insert(b, -1)
587 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000588 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200589
590 let lines =<< trim END
591 VAR b = 0zDEADBEEF
592 call insert(b, 257)
593 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000594 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200595
596 let lines =<< trim END
597 VAR b = 0zDEADBEEF
598 call insert(b, 0, [9])
599 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000600 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200601
602 let lines =<< trim END
603 VAR b = 0zDEADBEEF
604 call insert(b, 0, -20)
605 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000606 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200607
608 let lines =<< trim END
609 VAR b = 0zDEADBEEF
610 call insert(b, 0, 20)
611 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000612 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200613
614 let lines =<< trim END
615 VAR b = 0zDEADBEEF
616 call insert(b, [])
617 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000618 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200619
620 let lines =<< trim END
621 insert(test_null_blob(), 0x33)
622 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000623 call v9.CheckDefExecAndScriptFailure(lines, 'E1131:')
Sean Dewar80d73952021-08-04 19:25:54 +0200624
625 let lines =<< trim END
626 let b = 0zDEADBEEF
627 lockvar b
628 call insert(b, 3)
629 unlockvar b
630 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000631 call v9.CheckScriptFailure(lines, 'E741:')
Sean Dewar80d73952021-08-04 19:25:54 +0200632
633 let lines =<< trim END
634 vim9script
635 var b = 0zDEADBEEF
636 lockvar b
637 insert(b, 3)
638 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000639 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100640endfunc
641
642func Test_blob_reverse()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200643 let lines =<< trim END
644 call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF))
645 call assert_equal(0zBEADDE, reverse(0zDEADBE))
646 call assert_equal(0zADDE, reverse(0zDEAD))
647 call assert_equal(0zDE, reverse(0zDE))
648 call assert_equal(0z, reverse(test_null_blob()))
649 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000650 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100651endfunc
652
653func Test_blob_json_encode()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200654 let lines =<< trim END
655 call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF))
656 call assert_equal('[]', json_encode(0z))
657 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000658 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100659endfunc
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100660
661func Test_blob_lock()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200662 let lines =<< trim END
663 let b = 0z112233
664 lockvar b
665 unlockvar b
666 let b = 0z44
667 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000668 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200669
670 let lines =<< trim END
671 vim9script
672 var b = 0z112233
673 lockvar b
674 unlockvar b
675 b = 0z44
676 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000677 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200678
679 let lines =<< trim END
680 let b = 0z112233
681 lockvar b
682 let b = 0z44
683 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000684 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200685
686 let lines =<< trim END
687 vim9script
688 var b = 0z112233
689 lockvar b
690 b = 0z44
691 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000692 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100693endfunc
694
695func Test_blob_sort()
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100696 call v9.CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000697 call v9.CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100698endfunc
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100699
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200700" Tests for the blob2list() function
701func Test_blob2list()
702 call assert_fails('let v = blob2list(10)', 'E1238: Blob required for argument 1')
703 eval 0zFFFF->blob2list()->assert_equal([255, 255])
704 let tests = [[0z0102, [1, 2]],
705 \ [0z00, [0]],
706 \ [0z, []],
707 \ [0z00000000, [0, 0, 0, 0]],
708 \ [0zAABB.CCDD, [170, 187, 204, 221]]]
709 for t in tests
710 call assert_equal(t[0]->blob2list(), t[1])
711 endfor
712 exe 'let v = 0z' .. repeat('000102030405060708090A0B0C0D0E0F', 64)
713 call assert_equal(1024, blob2list(v)->len())
714 call assert_equal([4, 8, 15], [v[100], v[1000], v[1023]])
715 call assert_equal([], blob2list(test_null_blob()))
716endfunc
717
718" Tests for the list2blob() function
719func Test_list2blob()
720 call assert_fails('let b = list2blob(0z10)', 'E1211: List required for argument 1')
721 let tests = [[[1, 2], 0z0102],
722 \ [[0], 0z00],
723 \ [[], 0z],
724 \ [[0, 0, 0, 0], 0z00000000],
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200725 \ [[255, 255], 0zFFFF],
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200726 \ [[170, 187, 204, 221], 0zAABB.CCDD],
727 \ ]
728 for t in tests
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200729 call assert_equal(t[1], t[0]->list2blob())
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200730 endfor
731 call assert_fails('let b = list2blob([1, []])', 'E745:')
732 call assert_fails('let b = list2blob([-1])', 'E1239:')
733 call assert_fails('let b = list2blob([256])', 'E1239:')
734 let b = range(16)->repeat(64)->list2blob()
735 call assert_equal(1024, b->len())
736 call assert_equal([4, 8, 15], [b[100], b[1000], b[1023]])
kuuote04b7b4b2021-12-03 13:57:00 +0000737
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200738 call assert_equal(0z, list2blob(test_null_list()))
kuuote04b7b4b2021-12-03 13:57:00 +0000739 call assert_equal(0z00010203, list2blob(range(4)))
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200740endfunc
741
Yegappan Lakshmananbc404bf2021-12-19 19:19:31 +0000742" The following used to cause an out-of-bounds memory access
743func Test_blob2string()
744 let v = '0z' .. repeat('01010101.', 444)
745 let v ..= '01'
746 exe 'let b = ' .. v
747 call assert_equal(v, string(b))
748endfunc
kuuote04b7b4b2021-12-03 13:57:00 +0000749
Bakudankun375141e2022-09-09 18:46:47 +0100750func Test_blob_repeat()
751 call assert_equal(0z, repeat(0z00, 0))
752 call assert_equal(0z00, repeat(0z00, 1))
753 call assert_equal(0z0000, repeat(0z00, 2))
754 call assert_equal(0z00000000, repeat(0z0000, 2))
755
756 call assert_equal(0z, repeat(0z12, 0))
757 call assert_equal(0z, repeat(0z1234, 0))
758 call assert_equal(0z1234, repeat(0z1234, 1))
759 call assert_equal(0z12341234, repeat(0z1234, 2))
760endfunc
761
Yegappan Lakshmanan72bb47e2022-04-03 11:22:38 +0100762" Test for blob allocation failure
763func Test_blob_alloc_failure()
764 " blob variable
765 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
766 call assert_fails('let v = 0z10', 'E342:')
767
768 " blob slice
769 let v = 0z1020
770 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
771 call assert_fails('let x = v[0:0]', 'E342:')
772 call assert_equal(0z1020, x)
773
774 " blob remove()
775 let v = 0z10203040
776 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
777 call assert_fails('let x = remove(v, 1, 2)', 'E342:')
778 call assert_equal(0, x)
779
780 " list2blob()
781 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
782 call assert_fails('let a = list2blob([1, 2, 4])', 'E342:')
783 call assert_equal(0, a)
784
785 " mapnew()
786 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
787 call assert_fails('let x = mapnew(0z1234, {_, v -> 1})', 'E342:')
788 call assert_equal(0, x)
789
790 " copy()
791 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
792 call assert_fails('let x = copy(v)', 'E342:')
793 call assert_equal(0z, x)
794
795 " readblob()
796 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
797 call assert_fails('let x = readblob("test_blob.vim")', 'E342:')
798 call assert_equal(0, x)
799endfunc
800
Yegappan Lakshmananb2186552022-08-13 13:09:20 +0100801" Test for the indexof() function
802func Test_indexof()
803 let b = 0zdeadbeef
804 call assert_equal(0, indexof(b, {i, v -> v == 0xde}))
805 call assert_equal(3, indexof(b, {i, v -> v == 0xef}))
806 call assert_equal(-1, indexof(b, {i, v -> v == 0x1}))
807 call assert_equal(1, indexof(b, "v:val == 0xad"))
808 call assert_equal(-1, indexof(b, "v:val == 0xff"))
Yegappan Lakshmanan63acae12022-08-14 12:07:11 +0100809 call assert_equal(-1, indexof(b, {_, v -> "v == 0xad"}))
Yegappan Lakshmananb2186552022-08-13 13:09:20 +0100810
811 call assert_equal(-1, indexof(0z, "v:val == 0x0"))
812 call assert_equal(-1, indexof(test_null_blob(), "v:val == 0xde"))
813 call assert_equal(-1, indexof(b, test_null_string()))
814 call assert_equal(-1, indexof(b, test_null_function()))
815
816 let b = 0z01020102
817 call assert_equal(1, indexof(b, "v:val == 0x02", #{startidx: 0}))
818 call assert_equal(2, indexof(b, "v:val == 0x01", #{startidx: -2}))
819 call assert_equal(-1, indexof(b, "v:val == 0x01", #{startidx: 5}))
820 call assert_equal(0, indexof(b, "v:val == 0x01", #{startidx: -5}))
821 call assert_equal(0, indexof(b, "v:val == 0x01", test_null_dict()))
822
823 " failure cases
824 call assert_fails('let i = indexof(b, "val == 0xde")', 'E121:')
825 call assert_fails('let i = indexof(b, {})', 'E1256:')
826endfunc
827
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100828" vim: shiftwidth=2 sts=2 expandtab