* src/pmc/scalar.pmc:
[parrot.git] / t / pmc / array.t
blob63f37918a1494792447831a5b4f2a3560a75dde9
1 #! perl
2 # Copyright (C) 2001-2004, 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/array.t - Array PMC
15 =head1 SYNOPSIS
17     % prove t/pmc/array.t
19 =head1 DESCRIPTION
21 Tests C<Array> 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,.Array
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     set P0,2
84     set I0,P0
85     eq I0,2,OK_3
86     print "not "
87 OK_3:    print "ok 3\n"
89         new P1, .Integer
90         set P1, 3
91     set P0,P1
92     set I0,P0
93     eq I0,3,OK_4
94     print "not "
95 OK_4:    print "ok 4\n"
98         end
99 CODE
100 ok 1
101 ok 2
102 ok 3
103 ok 4
104 OUTPUT
106 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting first element" );
107         new P0, .Array
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],"Buckaroo"
123     set S0,P0[0]
124     eq S0,"Buckaroo",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, .Array
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],"Buckaroo"
152     set S0, P0[1]
153     eq S0,"Buckaroo",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, .Array
166         set P0, 1
168     set P0[1], -7
170     end
171 CODE
172 /^Array index out of bounds!
173 current instr/
174 OUTPUT
176 pasm_output_like( <<'CODE', <<'OUTPUT', "Getting out-of-bounds elements" );
177         new P0, .Array
178         set P0, 1
180     set I0, P0[1]
181     end
182 CODE
183 /^Array index out of bounds!
184 current instr/
185 OUTPUT
187 pasm_output_is( <<'CODE', <<OUTPUT, "defined" );
188     new P0, .Array
189     defined I0, P0
190     print I0
191     print "\n"
192     defined I0, P1
193     print I0
194     print "\n"
195     set P0, 5
196     set P0[0], 1
197     defined I0, P0[0]
198     print I0
199     print "\n"
200     defined I0, P0[1]
201     print I0
202     print "\n"
203     defined I0, P0[100]
204     print I0
205     print "\n"
206     new P1, .Undef
207     set P0[2], P1
208     defined I0, P0[2]
209     print I0
210     print "\n"
211     new P2, .Key
212     set P2, 3
213     set P0[3], 4
214     defined I0, P0[P2]
215     print I0
216     print "\n"
217     set P2, 4
218     defined I0, P0[P2]
219     print I0
220     print "\n"
221     end
222 CODE
231 OUTPUT
233 pasm_output_is( <<'CODE', <<OUTPUT, "exists" );
234     new P0, .Array
235     set P0, 5
236     set P0[0], 1
237     exists I0, P0[0]
238     print I0
239     print "\n"
240     exists I0, P0[1]
241     print I0
242     print "\n"
243     exists I0, P0[100]
244     print I0
245     print "\n"
246     new P1, .Undef
247     set P0[2], P1
248     exists I0, P0[2]
249     print I0
250     print "\n"
251     new P2, .Key
252     set P2, 3
253     set P0[3], 4
254     exists I0, P0[P2]
255     print I0
256     print "\n"
257     set P2, 4
258     exists I0, P0[P2]
259     print I0
260     print "\n"
261     end
262 CODE
269 OUTPUT
271 pasm_output_is( <<"CODE", <<'OUTPUT', "Set via PMC keys, access via INTs" );
272 @{[ $fp_equality_macro ]}
273      new P0, .Array
274      set P0, 4
275      new P1, .Key
277      set P1, 0
278      set P0[P1], 25
280      set P1, 1
281      set P0[P1], 2.5
283      set P1, 2
284      set P0[P1], "Squeek"
286      set P1, 3
287      new P2, .Hash
288      set P2["a"], "apple"
289      set P0[P1], P2
291      set I0, P0[0]
292      eq I0, 25, OK1
293      print "not "
294 OK1: print "ok 1\\n"
296      set N0, P0[1]
297      .fp_eq(N0, 2.5, OK2)
298      print "not "
299 OK2: print "ok 2\\n"
301      set S0, P0[2]
302      eq S0, "Squeek", OK3
303      print "not "
304 OK3: print "ok 3\\n"
306      set P3, P0[3]
307      set S1, P3["a"]
308      eq S1, "apple", OK4
309      print "not "
310 OK4: print "ok 4\\n"
312      end
313 CODE
314 ok 1
315 ok 2
316 ok 3
317 ok 4
318 OUTPUT
320 pasm_output_is( <<"CODE", <<'OUTPUT', "Set via INTs, access via PMC Keys" );
321 @{[ $fp_equality_macro ]}
322      new P0, .Array
323      set P0, 1024
325      set P0[25], 125
326      set P0[128], -9.9
327      set P0[513], "qwertyuiopasdfghjklzxcvbnm"
328      new P1, .Integer
329      set P1, 123456
330      set P0[1023], P1
332      new P2, .Key
333      set P2, 25
334      set I0, P0[P2]
335      eq I0, 125, OK1
336      print "not "
337 OK1: print "ok 1\\n"
339      set P2, 128
340      set N0, P0[P2]
341      .fp_eq(N0, -9.9, OK2)
342      print "not "
343 OK2: print "ok 2\\n"
345      set P2, 513
346      set S0, P0[P2]
347      eq S0, "qwertyuiopasdfghjklzxcvbnm", OK3
348      print "not "
349 OK3: print "ok 3\\n"
351      set P2, 1023
352      set P3, P0[P2]
353      set I1, P3
354      eq I1, 123456, OK4
355      print "not "
356 OK4: print "ok 4\\n"
358      end
359 CODE
360 ok 1
361 ok 2
362 ok 3
363 ok 4
364 OUTPUT
366 pasm_output_is( <<'CODE', <<OUT, "multikeyed access I arg" );
367     new P0, .Array
368     set P0, 1
369     new P1, .Array
370     set P1, 1
371     set P0[0], P1
372     set P0[0;0], 20
373     set P2, P0[0]
374     typeof S0, P2
375     print S0
376     print "\n"
377     set I2, P0[0;0]
378     print I2
379     set I3, 0
380     set I2, P0[I3;0]
381     print I2
382     set I2, P0[0;I3]
383     print I2
384     set I2, P0[I3;I3]
385     print I2
386     print "\n"
387     end
388 CODE
389 Array
390 20202020
393 pasm_output_is( <<'CODE', <<OUT, "multikeyed access P arg" );
394     new P0, .Array
395     set P0, 1
396     new P1, .Array
397     set P1, 1
398     new P3, .Integer
399     set P3, 20
400     set P0[0], P1
401     set P0[0;0], P3
402     set P2, P0[0]
403     typeof S0, P2
404     print S0
405     print "\n"
406     set I2, P0[0;0]
407     print I2
408     set I3, 0
409     set I2, P0[I3;0]
410     print I2
411     set I2, P0[0;I3]
412     print I2
413     set I2, P0[I3;I3]
414     print I2
415     print "\n"
416     end
417 CODE
418 Array
419 20202020
422 pasm_output_is( <<'CODE', <<OUT, "delete" );
423     new P0, .Array
424     set P0, 3
425     set P0[0], 10
426     set P0[1], 20
427     set P0[2], 30
429     delete P0[1]
430     set I0, P0
431     print I0
433     set I0, P0[0]
434     print I0
435     set I0, P0[1]
436     print I0
437     print "\n"
438     end
439 CODE
440 21030
443 pir_output_is( << 'CODE', << 'OUTPUT', "check whether interface is done" );
445 .sub _main
446     .local pmc pmc1
447     pmc1 = new Array
448     .local int bool1
449     does bool1, pmc1, "scalar"
450     print bool1
451     print "\n"
452     does bool1, pmc1, "array"
453     print bool1
454     print "\n"
455     does bool1, pmc1, "no_interface"
456     print bool1
457     print "\n"
458     end
459 .end
460 CODE
464 OUTPUT
468 # Local Variables:
469 #   mode: cperl
470 #   cperl-indent-level: 4
471 #   fill-column: 100
472 # End:
473 # vim: expandtab shiftwidth=4: