fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / bytebuffer.t
blobd5070b64590653c59d84a41e28b02971a183e14a
1 #!./parrot
2 # Copyright (C) 2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/bytebuffer.t - ByteBuffer PMC
9 =head1 SYNOPSIS
11     % prove t/pmc/bytebuffer.t
13 =head1 DESCRIPTION
15 Tests C<ByteBuffer> PMC..
17 =cut
19 .include 'iglobals.pasm'
20 .include 'iterator.pasm'
21 .include 'except_types.pasm'
23 .sub 'main' :main
24     .include 'test_more.pir'
25     plan(37)
27     test_init()
28     test_set_string()
29     test_set_byte()
30     test_get_string()
31     test_push()
32     test_resize()
33     test_alloc()
34     test_iterate()
35     test_invalid()
36 .end
38 ################################################################
39 # Helper subs
41 .sub hasicu
42     $P0 = getinterp
43     $P1 = $P0[.IGLOBALS_CONFIG_HASH]
44     $I0 = $P1['has_icu']
45     .return($I0)
46 .end
48 .sub isbigendian
49     $P0 = getinterp
50     $P1 = $P0[.IGLOBALS_CONFIG_HASH]
51     $I0 = $P1['bigendian']
52     .return($I0)
53 .end
55 ################################################################
57 .sub test_init
58     .local pmc bb
59     .local int n
60     bb = new ['ByteBuffer']
61     n = elements bb
62     is(n, 0, "size of a new buffer is 0")
64     bb = new ['ByteBuffer'], 42
65     n = elements bb
66     is(n, 42, "size of a new buffer with initial size is correct")
68 .end
70 .sub test_set_string
71     .local pmc bb
72     .local string s
73     .local int n, c
74     bb = new ['ByteBuffer']
75     s = 'Hi'
76     bb = s
78     # Exercise mark vtable
79     sweep 1
81     n = elements bb
82     is(n, 2, "size is the same as the source string bytelength")
83     n = bb[0]
84     c = ord 'H'
85     is(n, c, "first byte is the same as the source string")
86     n = bb[1]
87     c = ord 'i'
88     is(n, c, "second byte is the same as the source string")
89     n = bb[2]
90     is(n, 0, "byte out of size is 0")
91     n = bb[-1]
92     is(n, 0, "byte at negative index is 0")
93 .end
95 .sub test_set_byte
96     .local pmc bb
97     .local int n
98     bb = new ['ByteBuffer']
99     bb[255] = 42
100     n = elements bb
101     is(n, 256, "setting a byte resize empty buffer")
103     .local string s
104     s = 'Hi'
105     bb = s
106     bb[2] = 42
107     n = elements bb
108     is(n, 3, "setting a byte resize buffer initialized from string")
110     bb = new ['ByteBuffer'], 42
111     bb[41] = 9
112     n = elements bb
113     is(n, 42, "setting a byte within range does not resize")
114     bb[42] = 7
115     n = elements bb
116     is(n, 43, "setting a byte resize buffer with initial size")
117     n = bb[41]
118     is(n, 9, "resized buffer preserve old value")
120     push_eh catch
121     bb[-1] = 0
122     ok(0, "setting a byte with negative index should throw")
123     goto end
124 catch:
125     pop_eh
126     ok(1, "setting a byte with negative index throws")
127 end:
128 .end
130 .sub test_get_string
131     .local pmc bb
132     .local string s
133     .local int n
134     .local int big
136     bb = new ['ByteBuffer']
137     s = bb.'get_string'('ascii')
138     n = length s
139     is(s, 0, "getting from unitialized buffer gives empty string")
141     bb = binary:"abcd"
142     s = bb.'get_string'('ascii')
143     n = length s
144     is(n, 4, "getting ascii from buffer gives correct length")
145     is(s, "abcd", "getting ascii from buffer gives correct content")
147     $I0 = hasicu()
148     unless $I0 goto skip_it
150     bb = new ['ByteBuffer']
152     # Upper case n tilde: codepoint 0xD1, utf8 encoding 0xC3, 0x91
153     #bb = utf16:unicode:"\x{D1}"
154     # Can't do that, or the program can't be compiled without ICU.
155     # Fill the buffer with bytes instead.
157     # Get endianess to set the bytes in the appropiate order.
158     # *** XXX *** Need report from big endian platforms.
159     big = isbigendian()
160     if big goto isbig
161     bb[0] = 0xD1
162     bb[1] = 0x00
163     goto doit
164 isbig:
165     bb[0] = 0x00
166     bb[1] = 0xD1
167 doit:
168     s = bb.'get_string'('utf16')
169     n = length s
170     is(n, 1, "getting utf16 from buffer gives correct length")
171     n = ord s
172     is(n, 0xD1, "getting utf16 from buffer gives correct codepoint")
173     bb = new ['ByteBuffer']
174     bb[0] = 0xC3
175     bb[1] = 0x91
176     s = bb.'get_string_as'(utf8:unicode:"")
177     n = length s
178     is(n, 1, "getting utf8 from buffer gives correct length")
179     n = ord s
180     is(n, 0xD1, "getting utf8 from buffer gives correct codepoint")
181     goto end
182 skip_it:
183     skip(4, "this test needs ICU")
184 end:
185 .end
187 .sub test_push
188     .local pmc bb
189     .local int c, n, m
190     bb = new ['ByteBuffer']
191     bb = 'hell'
192     n = elements bb
193     inc n
194     c = ord 'o'
195     push bb, c
196     m = elements bb
197     is(n, m, "push increments size")
198     .local string s
199     s = bb.'get_string_as'(ascii:"")
200     is(s, 'hello', "push gives expected string result")
201 .end
203 .sub test_resize
204     .local pmc bb
205     .local int n
206     .local string s
207     bb = new ['ByteBuffer']
209     bb = 723
210     n = elements bb
211     is(n, 723, 'resize from empty')
213     bb = 42
214     n = elements bb
215     is(n, 42, 'reduce size')
217     bb = 999
218     n = elements bb
219     is(n, 999, 'increase size')
221     bb = 0
222     n = elements bb
223     is(n, 0, 'resize to 0')
225     bb = 'foobar'
226     bb = 3
227     n = elements bb
228     is(n, 3, 'reduce size from string content')
230     s = bb.'get_string_as'(ascii:"")
231     is(s, 'foo', 'resized string content has correct value')
233     bb = 'foobar'
234     bb = 7
235     n = elements bb
236     is(n, 7, 'increase size from string content')
238     # This test is for code coverage, zero filling is not a feature
239     # you should expect, it can be changed for performance reasons.
240     s = bb.'get_string_as'(binary:"")
241     is(s, binary:"foobar\x{0}", 'resized from string content is zero filled')
243     bb = 'barfoo'
244     bb = 0
245     n = elements bb
246     is(n, 0, 'resize to zero from string content')
248     bb = 42
249     bb = 0
250     n = elements bb
251     is(n, 0, 'resize to zero from allocated content')
253     .local pmc eh
254     eh = new ['ExceptionHandler']
255     eh.'handle_types'(.EXCEPTION_OUT_OF_BOUNDS)
256     set_addr eh, catch_negative
257     n = 1
258     push_eh eh
259     bb = -1
260     n = 0
261     goto test_negative
262 catch_negative:
263     finalize eh
264 test_negative:
265     pop_eh
266     ok(n, 'negative size throws')
267 .end
269 .sub test_alloc
270     # Exercise buffer reallocation building a utf16 string with the
271     # codepoints 32-8192
272     .local pmc bb
273     .local int i, big, pos, b0, b1, c
275     $I0 = hasicu()
276     unless $I0 goto skip_it
278     # Get endianess to set the bytes in the appropiate order.
279     # *** XXX *** Need report from big endian platforms.
280     big = isbigendian()
282     bb = new ['ByteBuffer']
283     pos = 0
284     i = 32
285 loopset:
286     b0 = div i, 256
287     b1 = mod i, 256
288     if big goto setbig
289     bb[pos] = b1
290     inc pos
291     bb[pos] = b0
292     inc pos
293     goto setdone
294 setbig:
295     bb[pos] = b0
296     inc pos
297     bb[pos] = b1
298     inc pos
299 setdone:
300     inc i
301     if i < 8192 goto loopset
303     .local string s
304     s = bb.'get_string'('utf16')
306     # Check string size
307     i = length s
308     if i != 8160 goto failed
310     # Check string content
311     i = 32
312     pos = 0
313 loopcheck:
314     c = ord s, pos
315     if c != i goto failed
316     inc pos
317     inc i
318     if i < 8192 goto loopcheck
319     ok(1, "reallocation")
320     goto end
321 failed:
322     say i
323     ok(0, "reallocation")
324     goto end
325 skip_it:
326     skip(1, "this test needs ICU")
327 end:
328 .end
330 .sub test_iterate
331     .local pmc bb, it, arr
332     .local string s
333     s = 'abcd'
334     bb = new ['ByteBuffer']
335     bb = s
336     it = iter bb
337     it = .ITERATE_FROM_START
338     arr = new ['ResizableStringArray']
339 loop:
340     unless it goto donearray
341     $I0 = shift it
342     $S0 = chr $I0
343     push arr, $S0
344     goto loop
345 donearray:
346     .local string r
347     r = join '', arr
348     is(r, s, 'iterate buffer content')
349 .end
351 .sub test_invalid
352     .local pmc bb, ex
353     .local string s
354     bb = new ['ByteBuffer']
355     bb = 'something'
356     push_eh catch_encoding
357     s = bb.'get_string'('ascii', '???INVALID eNCODING===')
358     pop_eh
359     ok(0, "get_string with invalid encoding should throw")
360     goto check_content
361 catch_encoding:
362     .get_results(ex)
363     finalize ex
364     pop_eh
365     ok(1, "get_string with invalid encoding throws")
366 check_content:
367     bb[0] = 128 # Out of ascii range
368     push_eh catch_content
369     s = bb.'get_string'('ascii', 'fixed_8')
370     pop_eh
371     ok(0, "get_string with invalid content should throw")
372     goto end
373 catch_content:
374     .get_results(ex)
375     finalize ex
376     pop_eh
377     ok(1, "get_string with invalid content throws")
378 end:
379 .end
381 # Local Variables:
382 #   mode: pir
383 #   fill-column: 100
384 # End:
385 # vim: expandtab shiftwidth=4 ft=pir: