* src/pmc/scalar.pmc:
[parrot.git] / t / pmc / fixedstringarray.t
blobb266bb48a9949ea78f983e9b5678053e6ba8971b
1 #! perl
2 # Copyright (C) 2001-2005, The Perl Foundation.
3 # $Id$
5 use strict;
6 use warnings;
7 use lib qw( . lib ../lib ../../lib );
8 use Test::More;
9 use Parrot::Test tests => 13;
11 =head1 NAME
13 t/pmc/fixedstringarray.t - FixedStringArray PMC
15 =head1 SYNOPSIS
17     % prove t/pmc/FixedStringArray.t
19 =head1 DESCRIPTION
21 Tests C<FixedStringArray> PMC. Checks size, sets various elements, including
22 out-of-bounds test. Checks INT and PMC keys.
24 =cut
26 my $fp_equality_macro = <<'ENDOFMACRO';
27 .macro fp_eq (  J, K, L )
28         save    N0
29         save    N1
30         save    N2
32         set     N0, .J
33         set     N1, .K
34         sub     N2, N1,N0
35         abs     N2, N2
36         gt      N2, 0.000001, .$FPEQNOK
38         restore N2
39         restore N1
40         restore N0
41         branch  .L
42 .local $FPEQNOK:
43         restore N2
44         restore N1
45         restore N0
46 .endm
47 .macro fp_ne(   J,K,L)
48         save    N0
49         save    N1
50         save    N2
52         set     N0, .J
53         set     N1, .K
54         sub     N2, N1,N0
55         abs     N2, N2
56         lt      N2, 0.000001, .$FPNENOK
58         restore N2
59         restore N1
60         restore N0
61         branch  .L
62 .local $FPNENOK:
63         restore N2
64         restore N1
65         restore N0
66 .endm
67 ENDOFMACRO
69 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting array size" );
70         new P0,.FixedStringArray
72         set I0,P0
73         eq I0,0,OK_1
74         print "not "
75 OK_1:   print "ok 1\n"
77         set P0,1
78         set I0,P0
79         eq I0,1,OK_2
80         print "not "
81 OK_2:   print "ok 2\n"
83         end
84 CODE
85 ok 1
86 ok 2
87 OUTPUT
89 pasm_output_like( <<'CODE', <<'OUTPUT', "Resetting array size (and getting an exception)" );
90         new P0, .FixedStringArray
92         set I0,P0
93         set P0,1
94         set P0,2
95         print "Should have gotten an exception\n "
98         end
99 CODE
100 /FixedStringArray: Can't resize!
101 current instr\.:/
102 OUTPUT
104 #VIM's syntax highlighter needs this line
106 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting first element" );
107         new P0, .FixedStringArray
108         set P0, 1
110         set P0[0],-7
111         set I0,P0[0]
112         eq I0,-7,OK_1
113         print "not "
114 OK_1:   print "ok 1\n"
116         set P0[0],3.7
117         set N0,P0[0]
118         eq N0,3.7,OK_2
119         print "not "
120 OK_2:   print "ok 2\n"
122         set P0[0],"muwhahaha"
123         set S0,P0[0]
124         eq S0,"muwhahaha",OK_3
125         print "not "
126 OK_3:   print "ok 3\n"
128         end
129 CODE
130 ok 1
131 ok 2
132 ok 3
133 OUTPUT
135 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting second element" );
136         new P0, .FixedStringArray
137         set P0, 2
139         set P0[1], -7
140         set I0, P0[1]
141         eq I0,-7,OK_1
142         print "not "
143 OK_1:   print "ok 1\n"
145         set P0[1], 3.7
146         set N0, P0[1]
147         eq N0,3.7,OK_2
148         print "not "
149 OK_2:   print "ok 2\n"
151         set P0[1],"purple"
152         set S0, P0[1]
153         eq S0,"purple",OK_3
154         print "not "
155 OK_3:   print "ok 3\n"
157         end
158 CODE
159 ok 1
160 ok 2
161 ok 3
162 OUTPUT
164 pasm_output_like( <<'CODE', <<'OUTPUT', "Setting out-of-bounds elements" );
165         new P0, .FixedStringArray
166         set P0, 1
168         set P0[1], -7
170         end
171 CODE
172 /FixedStringArray: index out of bounds!
173 current instr\.:/
174 OUTPUT
176 pasm_output_like( <<'CODE', <<'OUTPUT', "Getting out-of-bounds elements" );
177         new P0, .FixedStringArray
178         set P0, 1
180         set I0, P0[1]
181         end
182 CODE
183 /FixedStringArray: index out of bounds!
184 current instr\.:/
185 OUTPUT
187 pasm_output_is( <<"CODE", <<'OUTPUT', "Set via PMC keys, access via INTs" );
188 @{[ $fp_equality_macro ]}
189      new P0, .FixedStringArray
190      set P0, 3
191      new P1, .Key
193      set P1, 0
194      set P0[P1], 25
196      set P1, 1
197      set P0[P1], 2.5
199      set P1, 2
200      set P0[P1], "bleep"
202      set I0, P0[0]
203      eq I0, 25, OK1
204      print "not "
205 OK1: print "ok 1\\n"
207      set N0, P0[1]
208      .fp_eq(N0, 2.5, OK2)
209      print "not "
210 OK2: print "ok 2\\n"
212      set S0, P0[2]
213      eq S0, "bleep", OK3
214      print "not "
215 OK3: print "ok 3\\n"
217      end
218 CODE
219 ok 1
220 ok 2
221 ok 3
222 OUTPUT
224 pasm_output_is( <<"CODE", <<'OUTPUT', "Set via INTs, access via PMC Keys" );
225 @{[ $fp_equality_macro ]}
226      new P0, .FixedStringArray
227      set P0, 1024
229      set P0[25], 125
230      set P0[128], 10.2
231      set P0[513], "cow"
232      new P1, .Integer
233      set P1, 123456
234      set P0[1023], P1
236      new P2, .Key
237      set P2, 25
238      set I0, P0[P2]
239      eq I0, 125, OK1
240      print "not "
241 OK1: print "ok 1\\n"
243      set P2, 128
244      set N0, P0[P2]
245      .fp_eq(N0, 10.2, OK2)
246      print "not "
247 OK2: print "ok 2\\n"
249      set P2, 513
250      set S0, P0[P2]
251      eq S0, "cow", OK3
252      print "not "
253 OK3: print "ok 3\\n"
255      set P2, 1023
256      set P3, P0[P2]
257      set I1, P3
258      eq I1, 123456, OK4
259      print "not "
260 OK4: print "ok 4\\n"
262      end
263 CODE
264 ok 1
265 ok 2
266 ok 3
267 ok 4
268 OUTPUT
270 pir_output_is( << 'CODE', << 'OUTPUT', "check whether interface is done" );
272 .sub _main
273     .local pmc pmc1
274     pmc1 = new FixedStringArray
275     .local int bool1
276     does bool1, pmc1, "scalar"
277     print bool1
278     print "\n"
279     does bool1, pmc1, "array"
280     print bool1
281     print "\n"
282     does bool1, pmc1, "no_interface"
283     print bool1
284     print "\n"
285     end
286 .end
287 CODE
291 OUTPUT
293 pasm_output_is( <<'CODE', <<'OUTPUT', "Clone" );
294      new P0, .FixedStringArray
295      set P0, 3
296      set P0[0], "abcde"
297      set P0[1], "fghi"
298      set P0[2], "jkl"
299      clone P1, P0
300      set P0[0], ""
301      set P0[1], ""
302      set P0[2], ""
303      set S0, P1[0]
304      print S0
305      set S0, P1[1]
306      print S0
307      set S0, P1[2]
308      print S0
309      print "\n"
310      end
311 CODE
312 abcdefghijkl
313 OUTPUT
315 pasm_output_like( <<'CODE', <<'OUTPUT', "Cloning before size is set" );
316      new P0, .FixedStringArray
317      clone P1, P0
318      set P0, 10
319      set P1, 20
320      print "ok\n"
321      clone P2, P0
322      set P2, 30
323      end
324 CODE
326 FixedStringArray: Can't resize!
327 current instr\.:/
328 OUTPUT
330 #VIM's syntax highlighter needs this line
332 pasm_output_is( <<'CODE', <<'OUTPUT', "Truth" );
333      new P0, .FixedStringArray
334      unless P0, OK1
335      print "not "
336 OK1: print "ok 1\n"
337      set P0, 10
338      if P0, OK2
339      print "not "
340 OK2: print "ok 2\n"
341      end
342 CODE
343 ok 1
344 ok 2
345 OUTPUT
347 pasm_output_is( <<'CODE', <<'OUTPUT', "Garbage collection" );
348      new P0, .FixedStringArray
349      set P0, 8192
350      set I0, 0
351 L1:  set P0[I0], I0     
352      inc I0
353      lt I0, 8192, L1
354      sweep 1
355      set S0, P0[1000]
356      print S0
357      print "\n"
358      set S0, P0[2000]
359      print S0
360      print "\n"
361      set S0, P0[4000]
362      print S0
363      print "\n"
364      set S0, P0[8000]
365      print S0
366      print "\n"
367      end
368 CODE
369 1000
370 2000
371 4000
372 8000
373 OUTPUT
377 # Local Variables:
378 #   mode: cperl
379 #   cperl-indent-level: 4
380 #   fill-column: 100
381 # End:
382 # vim: expandtab shiftwidth=4: