blob: b249bc60c67dea41d790723da97076142b0de0bf [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:'])
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100121endfunc
122
123func Test_blob_get_range()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200124 let lines =<< trim END
125 VAR b = 0z0011223344
126 call assert_equal(0z2233, b[2 : 3])
127 call assert_equal(0z223344, b[2 : -1])
128 call assert_equal(0z00, b[0 : -5])
129 call assert_equal(0z, b[0 : -11])
130 call assert_equal(0z44, b[-1 :])
131 call assert_equal(0z0011223344, b[:])
132 call assert_equal(0z0011223344, b[: -1])
133 call assert_equal(0z, b[5 : 6])
134 call assert_equal(0z0011, b[-10 : 1])
135 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000136 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200137
138 " legacy script white space
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100139 let b = 0z0011223344
140 call assert_equal(0z2233, b[2:3])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100141endfunc
142
Bram Moolenaar2ea773b2019-01-15 22:16:42 +0100143func Test_blob_get()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200144 let lines =<< trim END
145 VAR b = 0z0011223344
146 call assert_equal(0x00, get(b, 0))
147 call assert_equal(0x22, get(b, 2, 999))
148 call assert_equal(0x44, get(b, 4))
149 call assert_equal(0x44, get(b, -1))
150 call assert_equal(-1, get(b, 5))
151 call assert_equal(999, get(b, 5, 999))
152 call assert_equal(-1, get(b, -8))
153 call assert_equal(999, get(b, -8, 999))
154 call assert_equal(10, get(test_null_blob(), 2, 10))
Bram Moolenaara5be9b62019-01-24 12:31:44 +0100155
Bram Moolenaar51e93322021-04-17 20:44:56 +0200156 call assert_equal(0x00, b[0])
157 call assert_equal(0x22, b[2])
158 call assert_equal(0x44, b[4])
159 call assert_equal(0x44, b[-1])
160 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000161 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200162
163 let lines =<< trim END
164 VAR b = 0z0011223344
165 echo b[5]
166 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000167 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar51e93322021-04-17 20:44:56 +0200168
169 let lines =<< trim END
170 VAR b = 0z0011223344
171 echo b[-8]
172 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000173 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar2ea773b2019-01-15 22:16:42 +0100174endfunc
175
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100176func Test_blob_to_string()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200177 let lines =<< trim END
178 VAR b = 0z00112233445566778899aabbccdd
179 call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b))
180 call assert_equal(b, eval(string(b)))
181 call remove(b, 4, -1)
182 call assert_equal('0z00112233', string(b))
183 call remove(b, 0, 3)
184 call assert_equal('0z', string(b))
185 call assert_equal('0z', string(test_null_blob()))
186 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000187 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100188endfunc
189
190func Test_blob_compare()
Bram Moolenaar51e93322021-04-17 20:44:56 +0200191 let lines =<< trim END
192 VAR b1 = 0z0011
193 VAR b2 = 0z1100
194 VAR b3 = 0z001122
195 call assert_true(b1 == b1)
196 call assert_false(b1 == b2)
197 call assert_false(b1 == b3)
198 call assert_true(b1 != b2)
199 call assert_true(b1 != b3)
200 call assert_true(b1 == 0z0011)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100201
Bram Moolenaar51e93322021-04-17 20:44:56 +0200202 call assert_false(b1 is b2)
203 LET b2 = b1
204 call assert_true(b1 == b2)
205 call assert_true(b1 is b2)
206 LET b2 = copy(b1)
207 call assert_true(b1 == b2)
208 call assert_false(b1 is b2)
209 LET b2 = b1[:]
210 call assert_true(b1 == b2)
211 call assert_false(b1 is b2)
212 call assert_true(b1 isnot b2)
213 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000214 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100215
Bram Moolenaar51e93322021-04-17 20:44:56 +0200216 let lines =<< trim END
217 VAR b1 = 0z0011
218 echo b1 == 9
219 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000220 call v9.CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200221
222 let lines =<< trim END
223 VAR b1 = 0z0011
224 echo b1 != 9
225 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000226 call v9.CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200227
228 let lines =<< trim END
229 VAR b1 = 0z0011
230 VAR b2 = 0z1100
231 VAR x = b1 > b2
232 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000233 call v9.CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200234
235 let lines =<< trim END
236 VAR b1 = 0z0011
237 VAR b2 = 0z1100
238 VAR x = b1 < b2
239 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000240 call v9.CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200241
242 let lines =<< trim END
243 VAR b1 = 0z0011
244 VAR b2 = 0z1100
245 VAR x = b1 - b2
246 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000247 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200248
249 let lines =<< trim END
250 VAR b1 = 0z0011
251 VAR b2 = 0z1100
252 VAR x = b1 / b2
253 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000254 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar51e93322021-04-17 20:44:56 +0200255
256 let lines =<< trim END
257 VAR b1 = 0z0011
258 VAR b2 = 0z1100
259 VAR x = b1 * b2
260 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000261 call v9.CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100262endfunc
263
Bram Moolenaar51e93322021-04-17 20:44:56 +0200264func Test_blob_index_assign()
265 let lines =<< trim END
266 VAR b = 0z00
267 LET b[1] = 0x11
268 LET b[2] = 0x22
269 call assert_equal(0z001122, b)
270 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000271 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar51e93322021-04-17 20:44:56 +0200272
273 let lines =<< trim END
274 VAR b = 0z00
275 LET b[2] = 0x33
276 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000277 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar51e93322021-04-17 20:44:56 +0200278
279 let lines =<< trim END
280 VAR b = 0z00
281 LET b[-2] = 0x33
282 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000283 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100284endfunc
285
286func Test_blob_for_loop()
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200287 let lines =<< trim END
288 VAR blob = 0z00010203
289 VAR i = 0
290 for byte in blob
291 call assert_equal(i, byte)
292 LET i += 1
293 endfor
294 call assert_equal(4, i)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100295
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200296 LET blob = 0z00
Bram Moolenaardd29ea12019-01-23 21:56:21 +0100297 call remove(blob, 0)
Bram Moolenaard551d6c2021-04-18 13:15:58 +0200298 call assert_equal(0, len(blob))
299 for byte in blob
300 call assert_report('loop over empty blob')
301 endfor
302
303 LET blob = 0z0001020304
304 LET i = 0
305 for byte in blob
306 call assert_equal(i, byte)
307 if i == 1
308 call remove(blob, 0)
309 elseif i == 3
310 call remove(blob, 3)
311 endif
312 LET i += 1
313 endfor
314 call assert_equal(5, i)
315 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000316 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100317endfunc
318
319func Test_blob_concatenate()
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200320 let lines =<< trim END
321 VAR b = 0z0011
322 LET b += 0z2233
323 call assert_equal(0z00112233, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100324
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200325 LET b = 0zDEAD + 0zBEEF
326 call assert_equal(0zDEADBEEF, b)
327 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000328 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100329
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200330 let lines =<< trim END
331 VAR b = 0z0011
332 LET b += "a"
333 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000334 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200335
336 let lines =<< trim END
337 VAR b = 0z0011
338 LET b += 88
339 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000340 call v9.CheckLegacyAndVim9Failure(lines, ['E734:', 'E1012:', 'E734:'])
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100341endfunc
342
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100343func Test_blob_add()
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200344 let lines =<< trim END
345 VAR b = 0z0011
346 call add(b, 0x22)
347 call assert_equal(0z001122, b)
348 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000349 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200350
351 " Only works in legacy script
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100352 let b = 0z0011
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100353 call add(b, '51')
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200354 call assert_equal(0z001133, b)
Bram Moolenaarea04a6e2020-04-23 13:38:02 +0200355 call assert_equal(1, add(test_null_blob(), 0x22))
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100356
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200357 let lines =<< trim END
358 VAR b = 0z0011
359 call add(b, [9])
360 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000361 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1012:', 'E1210:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200362
363 let lines =<< trim END
364 VAR b = 0z0011
365 call add("", 0x01)
366 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000367 call v9.CheckLegacyAndVim9Failure(lines, ['E897:', 'E1013:', 'E1226:'])
Bram Moolenaarb7c21af2021-04-18 14:12:31 +0200368
369 let lines =<< trim END
370 add(test_null_blob(), 0x22)
371 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000372 call v9.CheckDefExecAndScriptFailure(lines, 'E1131:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000373
374 let lines =<< trim END
375 let b = 0zDEADBEEF
376 lockvar b
377 call add(b, 0)
378 unlockvar b
379 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000380 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100381endfunc
382
383func Test_blob_empty()
384 call assert_false(empty(0z001122))
385 call assert_true(empty(0z))
386 call assert_true(empty(test_null_blob()))
387endfunc
388
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100389" Test removing items in blob
390func Test_blob_func_remove()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200391 let lines =<< trim END
392 #" Test removing 1 element
393 VAR b = 0zDEADBEEF
394 call assert_equal(0xDE, remove(b, 0))
395 call assert_equal(0zADBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100396
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200397 LET b = 0zDEADBEEF
398 call assert_equal(0xEF, remove(b, -1))
399 call assert_equal(0zDEADBE, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100400
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200401 LET b = 0zDEADBEEF
402 call assert_equal(0xAD, remove(b, 1))
403 call assert_equal(0zDEBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100404
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200405 #" Test removing range of element(s)
406 LET b = 0zDEADBEEF
407 call assert_equal(0zBE, remove(b, 2, 2))
408 call assert_equal(0zDEADEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100409
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200410 LET b = 0zDEADBEEF
411 call assert_equal(0zADBE, remove(b, 1, 2))
412 call assert_equal(0zDEEF, b)
413 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000414 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100415
416 " Test invalid cases
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200417 let lines =<< trim END
418 VAR b = 0zDEADBEEF
419 call remove(b, 5)
420 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000421 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200422
423 let lines =<< trim END
424 VAR b = 0zDEADBEEF
425 call remove(b, 1, 5)
426 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000427 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200428
429 let lines =<< trim END
430 VAR b = 0zDEADBEEF
431 call remove(b, 3, 2)
432 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000433 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200434
435 let lines =<< trim END
436 VAR b = 0zDEADBEEF
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200437 call remove(test_null_blob(), 1, 2)
438 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000439 call v9.CheckLegacyAndVim9Failure(lines, 'E979:')
Sean Dewar80d73952021-08-04 19:25:54 +0200440
441 let lines =<< trim END
442 let b = 0zDEADBEEF
443 lockvar b
444 call remove(b, 0)
445 unlockvar b
446 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000447 call v9.CheckScriptFailure(lines, 'E741:')
Sean Dewar80d73952021-08-04 19:25:54 +0200448
449 " can only check at script level, not in a :def function
450 let lines =<< trim END
451 vim9script
452 var b = 0zDEADBEEF
453 lockvar b
454 remove(b, 0)
455 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000456 call v9.CheckScriptFailure(lines, 'E741:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000457
458 call assert_fails('echo remove(0z1020, [])', 'E745:')
459 call assert_fails('echo remove(0z1020, 0, [])', 'E745:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100460endfunc
461
462func Test_blob_read_write()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200463 let lines =<< trim END
464 VAR b = 0zDEADBEEF
465 call writefile(b, 'Xblob')
466 VAR br = readfile('Xblob', 'B')
467 call assert_equal(b, br)
468 call delete('Xblob')
469 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000470 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar15352dc2020-04-06 21:12:42 +0200471
472 " This was crashing when calling readfile() with a directory.
473 call assert_fails("call readfile('.', 'B')", 'E17: "." is a directory')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100474endfunc
475
476" filter() item in blob
477func Test_blob_filter()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200478 let lines =<< trim END
479 call assert_equal(test_null_blob(), filter(test_null_blob(), '0'))
480 call assert_equal(0z, filter(0zDEADBEEF, '0'))
481 call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
482 call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE'))
483 call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF'))
484 call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
485 call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
486 call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
487 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000488 call v9.CheckLegacyAndVim9Success(lines)
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000489 call assert_fails('echo filter(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100490endfunc
491
492" map() item in blob
493func Test_blob_map()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200494 let lines =<< trim END
495 call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
496 call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
497 call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
498 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000499 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100500
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200501 let lines =<< trim END
502 call map(0z00, '[9]')
503 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000504 call v9.CheckLegacyAndVim9Failure(lines, 'E978:')
Yegappan Lakshmanan27708e62021-12-26 21:54:43 +0000505 call assert_fails('echo map(0z10, "a10")', 'E121:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100506endfunc
507
508func Test_blob_index()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200509 let lines =<< trim END
510 call assert_equal(2, index(0zDEADBEEF, 0xBE))
511 call assert_equal(-1, index(0zDEADBEEF, 0))
512 call assert_equal(2, index(0z11111111, 0x11, 2))
513 call assert_equal(3, 0z11110111->index(0x11, 2))
514 call assert_equal(2, index(0z11111111, 0x11, -2))
515 call assert_equal(3, index(0z11110111, 0x11, -2))
516 call assert_equal(0, index(0z11110111, 0x11, -10))
517 call assert_equal(-1, index(test_null_blob(), 1))
518 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000519 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100520endfunc
521
522func Test_blob_insert()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200523 let lines =<< trim END
524 VAR b = 0zDEADBEEF
525 call insert(b, 0x33)
526 call assert_equal(0z33DEADBEEF, b)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100527
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200528 LET b = 0zDEADBEEF
529 call insert(b, 0x33, 2)
530 call assert_equal(0zDEAD33BEEF, b)
531 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000532 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100533
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200534 " only works in legacy script
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200535 call assert_equal(0, insert(test_null_blob(), 0x33))
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200536
537 let lines =<< trim END
538 VAR b = 0zDEADBEEF
539 call insert(b, -1)
540 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000541 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200542
543 let lines =<< trim END
544 VAR b = 0zDEADBEEF
545 call insert(b, 257)
546 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000547 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200548
549 let lines =<< trim END
550 VAR b = 0zDEADBEEF
551 call insert(b, 0, [9])
552 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000553 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200554
555 let lines =<< trim END
556 VAR b = 0zDEADBEEF
557 call insert(b, 0, -20)
558 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000559 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200560
561 let lines =<< trim END
562 VAR b = 0zDEADBEEF
563 call insert(b, 0, 20)
564 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000565 call v9.CheckLegacyAndVim9Failure(lines, 'E475:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200566
567 let lines =<< trim END
568 VAR b = 0zDEADBEEF
569 call insert(b, [])
570 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000571 call v9.CheckLegacyAndVim9Failure(lines, ['E745:', 'E1013:', 'E1210:'])
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200572
573 let lines =<< trim END
574 insert(test_null_blob(), 0x33)
575 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000576 call v9.CheckDefExecAndScriptFailure(lines, 'E1131:')
Sean Dewar80d73952021-08-04 19:25:54 +0200577
578 let lines =<< trim END
579 let b = 0zDEADBEEF
580 lockvar b
581 call insert(b, 3)
582 unlockvar b
583 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000584 call v9.CheckScriptFailure(lines, 'E741:')
Sean Dewar80d73952021-08-04 19:25:54 +0200585
586 let lines =<< trim END
587 vim9script
588 var b = 0zDEADBEEF
589 lockvar b
590 insert(b, 3)
591 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000592 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100593endfunc
594
595func Test_blob_reverse()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200596 let lines =<< trim END
597 call assert_equal(0zEFBEADDE, reverse(0zDEADBEEF))
598 call assert_equal(0zBEADDE, reverse(0zDEADBE))
599 call assert_equal(0zADDE, reverse(0zDEAD))
600 call assert_equal(0zDE, reverse(0zDE))
601 call assert_equal(0z, reverse(test_null_blob()))
602 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000603 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100604endfunc
605
606func Test_blob_json_encode()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200607 let lines =<< trim END
608 call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF))
609 call assert_equal('[]', json_encode(0z))
610 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000611 call v9.CheckLegacyAndVim9Success(lines)
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100612endfunc
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100613
614func Test_blob_lock()
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200615 let lines =<< trim END
616 let b = 0z112233
617 lockvar b
618 unlockvar b
619 let b = 0z44
620 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000621 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200622
623 let lines =<< trim END
624 vim9script
625 var b = 0z112233
626 lockvar b
627 unlockvar b
628 b = 0z44
629 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000630 call v9.CheckScriptSuccess(lines)
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200631
632 let lines =<< trim END
633 let b = 0z112233
634 lockvar b
635 let b = 0z44
636 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000637 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaar39211cb2021-04-18 15:48:04 +0200638
639 let lines =<< trim END
640 vim9script
641 var b = 0z112233
642 lockvar b
643 b = 0z44
644 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000645 call v9.CheckScriptFailure(lines, 'E741:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100646endfunc
647
648func Test_blob_sort()
Bram Moolenaar92be6e32020-01-30 19:39:04 +0100649 if has('float')
Bram Moolenaar62aec932022-01-29 21:45:34 +0000650 call v9.CheckLegacyAndVim9Failure(['call sort([1.0, 0z11], "f")'], 'E975:')
Bram Moolenaar92be6e32020-01-30 19:39:04 +0100651 endif
Bram Moolenaar62aec932022-01-29 21:45:34 +0000652 call v9.CheckLegacyAndVim9Failure(['call sort([11, 0z11], "N")'], 'E974:')
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100653endfunc
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100654
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200655" Tests for the blob2list() function
656func Test_blob2list()
657 call assert_fails('let v = blob2list(10)', 'E1238: Blob required for argument 1')
658 eval 0zFFFF->blob2list()->assert_equal([255, 255])
659 let tests = [[0z0102, [1, 2]],
660 \ [0z00, [0]],
661 \ [0z, []],
662 \ [0z00000000, [0, 0, 0, 0]],
663 \ [0zAABB.CCDD, [170, 187, 204, 221]]]
664 for t in tests
665 call assert_equal(t[0]->blob2list(), t[1])
666 endfor
667 exe 'let v = 0z' .. repeat('000102030405060708090A0B0C0D0E0F', 64)
668 call assert_equal(1024, blob2list(v)->len())
669 call assert_equal([4, 8, 15], [v[100], v[1000], v[1023]])
670 call assert_equal([], blob2list(test_null_blob()))
671endfunc
672
673" Tests for the list2blob() function
674func Test_list2blob()
675 call assert_fails('let b = list2blob(0z10)', 'E1211: List required for argument 1')
676 let tests = [[[1, 2], 0z0102],
677 \ [[0], 0z00],
678 \ [[], 0z],
679 \ [[0, 0, 0, 0], 0z00000000],
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200680 \ [[255, 255], 0zFFFF],
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200681 \ [[170, 187, 204, 221], 0zAABB.CCDD],
682 \ ]
683 for t in tests
Yegappan Lakshmanan820d5522021-09-17 21:07:35 +0200684 call assert_equal(t[1], t[0]->list2blob())
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200685 endfor
686 call assert_fails('let b = list2blob([1, []])', 'E745:')
687 call assert_fails('let b = list2blob([-1])', 'E1239:')
688 call assert_fails('let b = list2blob([256])', 'E1239:')
689 let b = range(16)->repeat(64)->list2blob()
690 call assert_equal(1024, b->len())
691 call assert_equal([4, 8, 15], [b[100], b[1000], b[1023]])
kuuote04b7b4b2021-12-03 13:57:00 +0000692
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200693 call assert_equal(0z, list2blob(test_null_list()))
kuuote04b7b4b2021-12-03 13:57:00 +0000694 call assert_equal(0z00010203, list2blob(range(4)))
Yegappan Lakshmanan5dfe4672021-09-14 17:54:30 +0200695endfunc
696
Yegappan Lakshmananbc404bf2021-12-19 19:19:31 +0000697" The following used to cause an out-of-bounds memory access
698func Test_blob2string()
699 let v = '0z' .. repeat('01010101.', 444)
700 let v ..= '01'
701 exe 'let b = ' .. v
702 call assert_equal(v, string(b))
703endfunc
kuuote04b7b4b2021-12-03 13:57:00 +0000704
Yegappan Lakshmanan72bb47e2022-04-03 11:22:38 +0100705" Test for blob allocation failure
706func Test_blob_alloc_failure()
707 " blob variable
708 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
709 call assert_fails('let v = 0z10', 'E342:')
710
711 " blob slice
712 let v = 0z1020
713 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
714 call assert_fails('let x = v[0:0]', 'E342:')
715 call assert_equal(0z1020, x)
716
717 " blob remove()
718 let v = 0z10203040
719 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
720 call assert_fails('let x = remove(v, 1, 2)', 'E342:')
721 call assert_equal(0, x)
722
723 " list2blob()
724 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
725 call assert_fails('let a = list2blob([1, 2, 4])', 'E342:')
726 call assert_equal(0, a)
727
728 " mapnew()
729 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
730 call assert_fails('let x = mapnew(0z1234, {_, v -> 1})', 'E342:')
731 call assert_equal(0, x)
732
733 " copy()
734 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
735 call assert_fails('let x = copy(v)', 'E342:')
736 call assert_equal(0z, x)
737
738 " readblob()
739 call test_alloc_fail(GetAllocId('blob_alloc'), 0, 0)
740 call assert_fails('let x = readblob("test_blob.vim")', 'E342:')
741 call assert_equal(0, x)
742endfunc
743
Bram Moolenaar0e05de42020-03-25 22:23:46 +0100744" vim: shiftwidth=2 sts=2 expandtab