blob: a54cede9e88022c6e3bc2c79118bd165a3708bff [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.Takata11df3ae2022-10-19 14:02:40 +0100511 call assert_fails("call readblob('notexist')", 'E484:')
512 " TODO: How do we test for the E485 error?
513
Bram Moolenaar15352dc2020-04-06 21:12:42 +0200514 " This was crashing when calling readfile() with a directory.
515 call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100516endfunc
517
518" filter() item in blob
519func Test_blob_filter()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200520 let lines =<< trim END
521 call assert_equal(test_null_blob(), filter(test_null_blob(), '0'))
522 call assert_equal(0z, filter(0zDEADBEEF, '0'))
523 call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
524 call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE'))
525 call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF'))
526 call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
527 call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
528 call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
529 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000530 call v9.CheckLegacyAndVim9Success(lines)
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000531 call assert_fails('echo filter(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100532endfunc
533
534" map() item in blob
535func Test_blob_map()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200536 let lines =<< trim END
537 call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
538 call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
539 call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
540 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000541 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100542
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200543 let lines =<< trim END
544 call map(0z00, '[9]')
545 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000546 call v9.CheckLegacyAndVim9Failure(lines, 'E978:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000547 call assert_fails('echo map(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100548endfunc
549
550func Test_blob_index()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200551 let lines =<< trim END
552 call assert_equal(2, index(0zDEADBEEF, 0xBE))
553 call assert_equal(-1, index(0zDEADBEEF, 0))
554 call assert_equal(2, index(0z11111111, 0x11, 2))
555 call assert_equal(3, 0z11110111->index(0x11, 2))
556 call assert_equal(2, index(0z11111111, 0x11, -2))
557 call assert_equal(3, index(0z11110111, 0x11, -2))
558 call assert_equal(0, index(0z11110111, 0x11, -10))
559 call assert_equal(-1, index(test_null_blob(), 1))
560 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000561 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100562endfunc
563
564func Test_blob_insert()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200565 let lines =<< trim END
566 VAR b = 0zDEADBEEF
567 call insert(b, 0x33)
568 call assert_equal(0z33DEADBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100569
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200570 LET b = 0zDEADBEEF
571 call insert(b, 0x33, 2)
572 call assert_equal(0zDEAD33BEEF, b)
573 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000574 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100575
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200576 " only works in legacy script
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200577 call assert_equal(0, insert(test_null_blob(), 0x33))
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200578
579 let lines =<< trim END
580 VAR b = 0zDEADBEEF
581 call insert(b, -1)
582 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000583 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200584
585 let lines =<< trim END
586 VAR b = 0zDEADBEEF
587 call insert(b, 257)
588 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000589 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200590
591 let lines =<< trim END
592 VAR b = 0zDEADBEEF
593 call insert(b, 0, [9])
594 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000595 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200596
597 let lines =<< trim END
598 VAR b = 0zDEADBEEF
599 call insert(b, 0, -20)
600 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000601 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200602
603 let lines =<< trim END
604 VAR b = 0zDEADBEEF
605 call insert(b, 0, 20)
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, [])
612 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000613 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200614
615 let lines =<< trim END
616 insert(test_null_blob(), 0x33)
617 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000618 call v9.CheckDefExecAndScriptFailure(lines, 'E1131:')
Sean Dewar80d73952021-08-04 19:25:54 +0200619
620 let lines =<< trim END
621 let b = 0zDEADBEEF
622 lockvar b
623 call insert(b, 3)
624 unlockvar b
625 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000626 call v9.CheckScriptFailure(lines, 'E741:')
Sean Dewar80d73952021-08-04 19:25:54 +0200627
628 let lines =<< trim END
629 vim9script
630 var b = 0zDEADBEEF
631 lockvar b
632 insert(b, 3)
633 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000634 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100635endfunc
636
637func Test_blob_reverse()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200638 let lines =<< trim END
639 call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF))
640 call assert_equal(0zBEADDE, reverse(0zDEADBE))
641 call assert_equal(0zADDE, reverse(0zDEAD))
642 call assert_equal(0zDE, reverse(0zDE))
643 call assert_equal(0z, reverse(test_null_blob()))
644 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000645 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100646endfunc
647
648func Test_blob_json_encode()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200649 let lines =<< trim END
650 call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF))
651 call assert_equal('[]', json_encode(0z))
652 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000653 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100654endfunc
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100655
656func Test_blob_lock()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200657 let lines =<< trim END
658 let b = 0z112233
659 lockvar b
660 unlockvar b
661 let b = 0z44
662 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000663 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200664
665 let lines =<< trim END
666 vim9script
667 var b = 0z112233
668 lockvar b
669 unlockvar b
670 b = 0z44
671 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000672 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200673
674 let lines =<< trim END
675 let b = 0z112233
676 lockvar b
677 let b = 0z44
678 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000679 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200680
681 let lines =<< trim END
682 vim9script
683 var b = 0z112233
684 lockvar b
685 b = 0z44
686 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000687 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100688endfunc
689
690func Test_blob_sort()
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100691 call v9.CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000692 call v9.CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100693endfunc
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100694
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200695" Tests for the blob2list() function
696func Test_blob2list()
697 call assert_fails('let v = blob2list(10)', 'E1238: Blob required for argument 1')
698 eval 0zFFFF->blob2list()->assert_equal([255, 255])
699 let tests = [[0z0102, [1, 2]],
700 \ [0z00, [0]],
701 \ [0z, []],
702 \ [0z00000000, [0, 0, 0, 0]],
703 \ [0zAABB.CCDD, [170, 187, 204, 221]]]
704 for t in tests
705 call assert_equal(t[0]->blob2list(), t[1])
706 endfor
707 exe 'let v = 0z' .. repeat('000102030405060708090A0B0C0D0E0F', 64)
708 call assert_equal(1024, blob2list(v)->len())
709 call assert_equal([4, 8, 15], [v[100], v[1000], v[1023]])
710 call assert_equal([], blob2list(test_null_blob()))
711endfunc
712
713" Tests for the list2blob() function
714func Test_list2blob()
715 call assert_fails('let b = list2blob(0z10)', 'E1211: List required for argument 1')
716 let tests = [[[1, 2], 0z0102],
717 \ [[0], 0z00],
718 \ [[], 0z],
719 \ [[0, 0, 0, 0], 0z00000000],
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200720 \ [[255, 255], 0zFFFF],
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200721 \ [[170, 187, 204, 221], 0zAABB.CCDD],
722 \ ]
723 for t in tests
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200724 call assert_equal(t[1], t[0]->list2blob())
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200725 endfor
726 call assert_fails('let b = list2blob([1, []])', 'E745:')
727 call assert_fails('let b = list2blob([-1])', 'E1239:')
728 call assert_fails('let b = list2blob([256])', 'E1239:')
729 let b = range(16)->repeat(64)->list2blob()
730 call assert_equal(1024, b->len())
731 call assert_equal([4, 8, 15], [b[100], b[1000], b[1023]])
kuuote04b7b4b2021-12-03 13:57:00 +0000732
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200733 call assert_equal(0z, list2blob(test_null_list()))
kuuote04b7b4b2021-12-03 13:57:00 +0000734 call assert_equal(0z00010203, list2blob(range(4)))
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200735endfunc
736
Yegappan Lakshmananbc404bf2021-12-19 19:19:31 +0000737" The following used to cause an out-of-bounds memory access
738func Test_blob2string()
739 let v = '0z' .. repeat('01010101.', 444)
740 let v ..= '01'
741 exe 'let b = ' .. v
742 call assert_equal(v, string(b))
743endfunc
kuuote04b7b4b2021-12-03 13:57:00 +0000744
Bakudankun375141e2022-09-09 18:46:47 +0100745func Test_blob_repeat()
746 call assert_equal(0z, repeat(0z00, 0))
747 call assert_equal(0z00, repeat(0z00, 1))
748 call assert_equal(0z0000, repeat(0z00, 2))
749 call assert_equal(0z00000000, repeat(0z0000, 2))
750
751 call assert_equal(0z, repeat(0z12, 0))
752 call assert_equal(0z, repeat(0z1234, 0))
753 call assert_equal(0z1234, repeat(0z1234, 1))
754 call assert_equal(0z12341234, repeat(0z1234, 2))
755endfunc
756
Yegappan Lakshmanan72bb47e2022-04-03 11:22:38 +0100757" Test for blob allocation failure
758func Test_blob_alloc_failure()
759 " blob variable
760 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
761 call assert_fails('let v = 0z10', 'E342:')
762
763 " blob slice
764 let v = 0z1020
765 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
766 call assert_fails('let x = v[0:0]', 'E342:')
767 call assert_equal(0z1020, x)
768
769 " blob remove()
770 let v = 0z10203040
771 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
772 call assert_fails('let x = remove(v, 1, 2)', 'E342:')
773 call assert_equal(0, x)
774
775 " list2blob()
776 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
777 call assert_fails('let a = list2blob([1, 2, 4])', 'E342:')
778 call assert_equal(0, a)
779
780 " mapnew()
781 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
782 call assert_fails('let x = mapnew(0z1234, {_, v -> 1})', 'E342:')
783 call assert_equal(0, x)
784
785 " copy()
786 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
787 call assert_fails('let x = copy(v)', 'E342:')
788 call assert_equal(0z, x)
789
790 " readblob()
791 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
792 call assert_fails('let x = readblob("test_blob.vim")', 'E342:')
793 call assert_equal(0, x)
794endfunc
795
Yegappan Lakshmananb2186552022-08-13 13:09:20 +0100796" Test for the indexof() function
797func Test_indexof()
798 let b = 0zdeadbeef
799 call assert_equal(0, indexof(b, {i, v -> v == 0xde}))
800 call assert_equal(3, indexof(b, {i, v -> v == 0xef}))
801 call assert_equal(-1, indexof(b, {i, v -> v == 0x1}))
802 call assert_equal(1, indexof(b, "v:val == 0xad"))
803 call assert_equal(-1, indexof(b, "v:val == 0xff"))
Yegappan Lakshmanan63acae12022-08-14 12:07:11 +0100804 call assert_equal(-1, indexof(b, {_, v -> "v == 0xad"}))
Yegappan Lakshmananb2186552022-08-13 13:09:20 +0100805
806 call assert_equal(-1, indexof(0z, "v:val == 0x0"))
807 call assert_equal(-1, indexof(test_null_blob(), "v:val == 0xde"))
808 call assert_equal(-1, indexof(b, test_null_string()))
809 call assert_equal(-1, indexof(b, test_null_function()))
810
811 let b = 0z01020102
812 call assert_equal(1, indexof(b, "v:val == 0x02", #{startidx: 0}))
813 call assert_equal(2, indexof(b, "v:val == 0x01", #{startidx: -2}))
814 call assert_equal(-1, indexof(b, "v:val == 0x01", #{startidx: 5}))
815 call assert_equal(0, indexof(b, "v:val == 0x01", #{startidx: -5}))
816 call assert_equal(0, indexof(b, "v:val == 0x01", test_null_dict()))
817
818 " failure cases
819 call assert_fails('let i = indexof(b, "val == 0xde")', 'E121:')
820 call assert_fails('let i = indexof(b, {})', 'E1256:')
821endfunc
822
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100823" vim: shiftwidth=2 sts=2 expandtab