blob: b0239fd61055c4b4c09a16fcdde4891162ff615c [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)
491 call delete('Xblob')
492 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000493 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar15352dc2020-04-06 21:12:42 +0200494
495 " This was crashing when calling readfile() with a directory.
496 call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100497endfunc
498
499" filter() item in blob
500func Test_blob_filter()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200501 let lines =<< trim END
502 call assert_equal(test_null_blob(), filter(test_null_blob(), '0'))
503 call assert_equal(0z, filter(0zDEADBEEF, '0'))
504 call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
505 call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE'))
506 call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF'))
507 call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
508 call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
509 call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
510 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000511 call v9.CheckLegacyAndVim9Success(lines)
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000512 call assert_fails('echo filter(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100513endfunc
514
515" map() item in blob
516func Test_blob_map()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200517 let lines =<< trim END
518 call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
519 call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
520 call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
521 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000522 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100523
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200524 let lines =<< trim END
525 call map(0z00, '[9]')
526 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000527 call v9.CheckLegacyAndVim9Failure(lines, 'E978:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000528 call assert_fails('echo map(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100529endfunc
530
531func Test_blob_index()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200532 let lines =<< trim END
533 call assert_equal(2, index(0zDEADBEEF, 0xBE))
534 call assert_equal(-1, index(0zDEADBEEF, 0))
535 call assert_equal(2, index(0z11111111, 0x11, 2))
536 call assert_equal(3, 0z11110111->index(0x11, 2))
537 call assert_equal(2, index(0z11111111, 0x11, -2))
538 call assert_equal(3, index(0z11110111, 0x11, -2))
539 call assert_equal(0, index(0z11110111, 0x11, -10))
540 call assert_equal(-1, index(test_null_blob(), 1))
541 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000542 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100543endfunc
544
545func Test_blob_insert()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200546 let lines =<< trim END
547 VAR b = 0zDEADBEEF
548 call insert(b, 0x33)
549 call assert_equal(0z33DEADBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100550
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200551 LET b = 0zDEADBEEF
552 call insert(b, 0x33, 2)
553 call assert_equal(0zDEAD33BEEF, b)
554 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000555 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100556
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200557 " only works in legacy script
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200558 call assert_equal(0, insert(test_null_blob(), 0x33))
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200559
560 let lines =<< trim END
561 VAR b = 0zDEADBEEF
562 call insert(b, -1)
563 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000564 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200565
566 let lines =<< trim END
567 VAR b = 0zDEADBEEF
568 call insert(b, 257)
569 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000570 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200571
572 let lines =<< trim END
573 VAR b = 0zDEADBEEF
574 call insert(b, 0, [9])
575 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000576 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200577
578 let lines =<< trim END
579 VAR b = 0zDEADBEEF
580 call insert(b, 0, -20)
581 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000582 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200583
584 let lines =<< trim END
585 VAR b = 0zDEADBEEF
586 call insert(b, 0, 20)
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, [])
593 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000594 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200595
596 let lines =<< trim END
597 insert(test_null_blob(), 0x33)
598 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000599 call v9.CheckDefExecAndScriptFailure(lines, 'E1131:')
Sean Dewar80d73952021-08-04 19:25:54 +0200600
601 let lines =<< trim END
602 let b = 0zDEADBEEF
603 lockvar b
604 call insert(b, 3)
605 unlockvar b
606 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000607 call v9.CheckScriptFailure(lines, 'E741:')
Sean Dewar80d73952021-08-04 19:25:54 +0200608
609 let lines =<< trim END
610 vim9script
611 var b = 0zDEADBEEF
612 lockvar b
613 insert(b, 3)
614 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000615 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100616endfunc
617
618func Test_blob_reverse()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200619 let lines =<< trim END
620 call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF))
621 call assert_equal(0zBEADDE, reverse(0zDEADBE))
622 call assert_equal(0zADDE, reverse(0zDEAD))
623 call assert_equal(0zDE, reverse(0zDE))
624 call assert_equal(0z, reverse(test_null_blob()))
625 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000626 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100627endfunc
628
629func Test_blob_json_encode()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200630 let lines =<< trim END
631 call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF))
632 call assert_equal('[]', json_encode(0z))
633 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000634 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100635endfunc
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100636
637func Test_blob_lock()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200638 let lines =<< trim END
639 let b = 0z112233
640 lockvar b
641 unlockvar b
642 let b = 0z44
643 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000644 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200645
646 let lines =<< trim END
647 vim9script
648 var b = 0z112233
649 lockvar b
650 unlockvar b
651 b = 0z44
652 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000653 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200654
655 let lines =<< trim END
656 let b = 0z112233
657 lockvar b
658 let b = 0z44
659 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000660 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200661
662 let lines =<< trim END
663 vim9script
664 var b = 0z112233
665 lockvar b
666 b = 0z44
667 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000668 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100669endfunc
670
671func Test_blob_sort()
Bram Moolenaar92be6e32020-01-30 19:39:04 +0100672 if has('float')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000673 call v9.CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:')
Bram Moolenaar92be6e32020-01-30 19:39:04 +0100674 endif
Bram Moolenaar62aec932022-01-29 21:45:34 +0000675 call v9.CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100676endfunc
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100677
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200678" Tests for the blob2list() function
679func Test_blob2list()
680 call assert_fails('let v = blob2list(10)', 'E1238: Blob required for argument 1')
681 eval 0zFFFF->blob2list()->assert_equal([255, 255])
682 let tests = [[0z0102, [1, 2]],
683 \ [0z00, [0]],
684 \ [0z, []],
685 \ [0z00000000, [0, 0, 0, 0]],
686 \ [0zAABB.CCDD, [170, 187, 204, 221]]]
687 for t in tests
688 call assert_equal(t[0]->blob2list(), t[1])
689 endfor
690 exe 'let v = 0z' .. repeat('000102030405060708090A0B0C0D0E0F', 64)
691 call assert_equal(1024, blob2list(v)->len())
692 call assert_equal([4, 8, 15], [v[100], v[1000], v[1023]])
693 call assert_equal([], blob2list(test_null_blob()))
694endfunc
695
696" Tests for the list2blob() function
697func Test_list2blob()
698 call assert_fails('let b = list2blob(0z10)', 'E1211: List required for argument 1')
699 let tests = [[[1, 2], 0z0102],
700 \ [[0], 0z00],
701 \ [[], 0z],
702 \ [[0, 0, 0, 0], 0z00000000],
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200703 \ [[255, 255], 0zFFFF],
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200704 \ [[170, 187, 204, 221], 0zAABB.CCDD],
705 \ ]
706 for t in tests
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200707 call assert_equal(t[1], t[0]->list2blob())
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200708 endfor
709 call assert_fails('let b = list2blob([1, []])', 'E745:')
710 call assert_fails('let b = list2blob([-1])', 'E1239:')
711 call assert_fails('let b = list2blob([256])', 'E1239:')
712 let b = range(16)->repeat(64)->list2blob()
713 call assert_equal(1024, b->len())
714 call assert_equal([4, 8, 15], [b[100], b[1000], b[1023]])
kuuote04b7b4b2021-12-03 13:57:00 +0000715
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200716 call assert_equal(0z, list2blob(test_null_list()))
kuuote04b7b4b2021-12-03 13:57:00 +0000717 call assert_equal(0z00010203, list2blob(range(4)))
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200718endfunc
719
Yegappan Lakshmananbc404bf2021-12-19 19:19:31 +0000720" The following used to cause an out-of-bounds memory access
721func Test_blob2string()
722 let v = '0z' .. repeat('01010101.', 444)
723 let v ..= '01'
724 exe 'let b = ' .. v
725 call assert_equal(v, string(b))
726endfunc
kuuote04b7b4b2021-12-03 13:57:00 +0000727
Bakudankun375141e2022-09-09 18:46:47 +0100728func Test_blob_repeat()
729 call assert_equal(0z, repeat(0z00, 0))
730 call assert_equal(0z00, repeat(0z00, 1))
731 call assert_equal(0z0000, repeat(0z00, 2))
732 call assert_equal(0z00000000, repeat(0z0000, 2))
733
734 call assert_equal(0z, repeat(0z12, 0))
735 call assert_equal(0z, repeat(0z1234, 0))
736 call assert_equal(0z1234, repeat(0z1234, 1))
737 call assert_equal(0z12341234, repeat(0z1234, 2))
738endfunc
739
Yegappan Lakshmanan72bb47e2022-04-03 11:22:38 +0100740" Test for blob allocation failure
741func Test_blob_alloc_failure()
742 " blob variable
743 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
744 call assert_fails('let v = 0z10', 'E342:')
745
746 " blob slice
747 let v = 0z1020
748 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
749 call assert_fails('let x = v[0:0]', 'E342:')
750 call assert_equal(0z1020, x)
751
752 " blob remove()
753 let v = 0z10203040
754 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
755 call assert_fails('let x = remove(v, 1, 2)', 'E342:')
756 call assert_equal(0, x)
757
758 " list2blob()
759 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
760 call assert_fails('let a = list2blob([1, 2, 4])', 'E342:')
761 call assert_equal(0, a)
762
763 " mapnew()
764 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
765 call assert_fails('let x = mapnew(0z1234, {_, v -> 1})', 'E342:')
766 call assert_equal(0, x)
767
768 " copy()
769 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
770 call assert_fails('let x = copy(v)', 'E342:')
771 call assert_equal(0z, x)
772
773 " readblob()
774 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
775 call assert_fails('let x = readblob("test_blob.vim")', 'E342:')
776 call assert_equal(0, x)
777endfunc
778
Yegappan Lakshmananb2186552022-08-13 13:09:20 +0100779" Test for the indexof() function
780func Test_indexof()
781 let b = 0zdeadbeef
782 call assert_equal(0, indexof(b, {i, v -> v == 0xde}))
783 call assert_equal(3, indexof(b, {i, v -> v == 0xef}))
784 call assert_equal(-1, indexof(b, {i, v -> v == 0x1}))
785 call assert_equal(1, indexof(b, "v:val == 0xad"))
786 call assert_equal(-1, indexof(b, "v:val == 0xff"))
Yegappan Lakshmanan63acae12022-08-14 12:07:11 +0100787 call assert_equal(-1, indexof(b, {_, v -> "v == 0xad"}))
Yegappan Lakshmananb2186552022-08-13 13:09:20 +0100788
789 call assert_equal(-1, indexof(0z, "v:val == 0x0"))
790 call assert_equal(-1, indexof(test_null_blob(), "v:val == 0xde"))
791 call assert_equal(-1, indexof(b, test_null_string()))
792 call assert_equal(-1, indexof(b, test_null_function()))
793
794 let b = 0z01020102
795 call assert_equal(1, indexof(b, "v:val == 0x02", #{startidx: 0}))
796 call assert_equal(2, indexof(b, "v:val == 0x01", #{startidx: -2}))
797 call assert_equal(-1, indexof(b, "v:val == 0x01", #{startidx: 5}))
798 call assert_equal(0, indexof(b, "v:val == 0x01", #{startidx: -5}))
799 call assert_equal(0, indexof(b, "v:val == 0x01", test_null_dict()))
800
801 " failure cases
802 call assert_fails('let i = indexof(b, "val == 0xde")', 'E121:')
803 call assert_fails('let i = indexof(b, {})', 'E1256:')
804endfunc
805
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100806" vim: shiftwidth=2 sts=2 expandtab