* src/pmc/scalar.pmc:
[parrot.git] / t / pmc / intlist.t
blob6b0f02de9791140f7b3523bb343e719addea1dd9
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 => 8;
11 =head1 NAME
13 t/pmc/intlist.t - Integer Array
15 =head1 SYNOPSIS
17     % prove t/pmc/intlist.t
19 =head1 DESCRIPTION
21 Tests the C<IntList> PMC. For sparse array tests of C<IntList>, please see
22 F<t/dynpmc/sparse_perlarray.t>.
24 =cut
26 pasm_output_is( <<'CODE', <<'OUTPUT', "creation" );
27         new P0, .IntList
28         set I0, P0
29         print "Created IntList with "
30         print I0
31         print " elements to start with.\n"
32         end
33 CODE
34 Created IntList with 0 elements to start with.
35 OUTPUT
37 # This test just runs way too slowly with GC_DEBUG turned on, so lets
38 # turn it off for make test runs.
39 pasm_output_is( <<'CODE', <<'OUTPUT', "aerobics" );
40         new P0, .IntList
41         set I10, 10000
43         set I1, 0
44         set I0, 0
45 buildup:
46         ge I0, I10, postBuildUp
47         push P0, I1
48         add I1, 1    # Push P0, I1++
49         push P0, I1
50         add I1, 1    # Push P0, I1++
51         push P0, I1
52         add I1, 1    # Push P0, I1++
54         pop I2, P0
55         mul I3, I0, 3
56         add I3, 2
57         ne I2, I3, errFirstPop  # fail if pop != I0 * 3 + 2
59         pop I2, P0
60         mul I3, I0, 3
61         add I3, 1
62         ne I2, I3, errSecondPop  # fail if pop != I0 * 3 + 1
64         set I2, P0
65         add I3, I0, 1
66         ne I2, I3, errBuildLen   # fail if length != I0 + 1
68         add I0, 1
69         branch buildup
70 postBuildUp:
72         set I0, 0
73 checkBuildUpLeft:
74         ge I0, I10, postCheckBuildUpLeft
75         set I2, P0[I0]
76         mul I3, I0, 3
77         ne I2, I3, errLeftGet
78         add I0, 1
79         branch checkBuildUpLeft
80 postCheckBuildUpLeft:
82         mul I0, I10, -1
83 checkBuildUpRight:
84         ge I0, 0, postCheckBuildUpRight
85         set I2, P0[I0]
86         add I3, I0, I10
87         mul I3, 3
88         ne I2, I3, errRightGet
89         add I0, 1
90         branch checkBuildUpRight
91 postCheckBuildUpRight:
93         mul I0, I10, 30
94         push P0, I0
96         set I0, I10
97 tearDown:
98         le I0, 0, postTearDown
99         pop I2, P0
100         mul I3, I0, 30
101         ne I2, I3, errTearCap
103         pop I2, P0
104         sub I3, I0, 1
105         mul I3, 3
106         ne I2, I3, errTearInner
108         mul I3, 10
109         push P0, I3
111         set I2, P0
112         ne I2, I0, errTearLength
114         sub I0, 1
115         branch tearDown
116 postTearDown:
118         pop I2, P0
119         ne I2, 0, errLast
121         print "I need a shower.\n"
122         end
123 errFirstPop:
124         print "FAILED: first pop\n"
125         bsr info
126         end
127 errSecondPop:
128         print "FAILED: second pop\n"
129         bsr info
130         end
131 errBuildLen:
132         print "FAILED: buildup length\n"
133         bsr info
134         end
135 errLeftGet:
136         print "FAILED: left get\n"
137         bsr info
138         end
139 errRightGet:
140         print "FAILED: right get\n"
141         bsr info
142         end
143 errTearCap:
144         print "FAILED: tear down cap\n"
145         bsr info
146         end
147 errTearInner:
148         print "FAILED: tear down inner\n"
149         bsr info
150         end
151 errTearLength:
152         print "FAILED: tear down length\n"
153         bsr info
154         end
155 errLast:
156         print "FAILED: last element (zero)\n"
157         set I3, 0
158         bsr info
159         end
160 info:
161         print "Found: "
162         print I2
163         print "\nWanted: "
164         print I3
165         print "\n"
166         ret
167 CODE
168 I need a shower.
169 OUTPUT
171 pasm_output_is( <<'CODE', <<'OUTPUT', "direct access 2" );
172         new P0, .IntList
173     set I10, 1100000
174     set I0, 1
175 lp1:
176     add I1, I0, 5
177     set P0[I0], I1
178     add I3, I1, I0
179     push P0, I3
180     shl I0, I0, 1
181     inc I0
182     le I0, I10, lp1
184     set I0, 1
185 lp2:
186     add I1, I0, 5
187     # check at I0
188     set I2, P0[I0]
189     ne I2, I1, err
190     add I4, I0, 1
191     # and pushed value at I0+1
192     set I4, P0[I4]
193     add I3, I1, I0
194     ne I3, I4, err
196     shl I0, I0, 1
197     inc I0
198     le I0, I10, lp2
199     print "ok\n"
200     end
201 err:
202     print "not ok "
203     print I0
204     print " "
205     print I1
206     print " "
207     print I2
208     print " "
209     print I3
210     print " "
211     print I4
212     print " "
213     print I5
214     print " "
215     print I6
216     print " "
217     print I7
218     print "\n"
220     end
221 CODE
223 OUTPUT
225 pasm_output_is( <<'CODE', <<'OUTPUT', "sparse access" );
226         new P0, .IntList
227     set I10, 110000
228     set I0, 1
229 lp1:
230     add I1, I0, 5
231     set P0[I0], I1
232     add I3, I1, I0
233     push P0, I3
234     shl I0, I0, 1
235     inc I0
236     le I0, I10, lp1
238     set I0, 1
239 lp2:
240     add I1, I0, 5
241     # check at I0
242     set I2, P0[I0]
243     ne I2, I1, err
244     add I4, I0, 1
245     # and pushed value at I0+1
246     set I4, P0[I4]
247     add I3, I1, I0
248     ne I3, I4, err
250     shl I0, I0, 1
251     inc I0
252     le I0, I10, lp2
253     print "ok 1\n"
255     # now repeat and fill some holes
257     set I0, 777
258 lp3:
259     add I1, I0, 5
260     set P0[I0], I1
261     add I0, I0, 666
262     le I0, I10, lp3
264     set I0, 777
265 lp4:
266     add I1, I0, 5
267     # check at I0
268     set I2, P0[I0]
269     ne I2, I1, err
271     add I0, I0, 666
272     le I0, I10, lp4
273     print "ok 2\n"
274     end
275 err:
276     print "not ok "
277     print I0
278     print " "
279     print I1
280     print " "
281     print I2
282     print " "
283     print I3
284     print " "
285     print I4
286     print "\n"
288     end
289 CODE
290 ok 1
291 ok 2
292 OUTPUT
294 pasm_output_is( <<'CODE', <<'OUTPUT', "pop into sparse" );
295         new P0, .IntList
296     set I10, 100
297     set I0, 0
298     # push some values at start
299 lp1:
300     push P0, I0
301     inc I0
302     lt I0, I10, lp1
304     # create sparse
305     set I0, 100000
306     set I1, 1000
307     set P0[I0], I1
308     inc I1
309 lp2:
310     # push some values after hole
311     push P0, I1
312     inc I1
313     le I1, 1100, lp2
314     dec I1
316     set I3, P0
317 lp3:
318     set I4, P0
319     ne I3, I4, err1
320     pop I2, P0
321     dec I3
322     ne I2, I1, err2
323     gt I3, I0, cont1
324     lt I3, I10, cont1
325     set I1, 0
327     gt I3, I10, lp3
328     set I1, I10
330 cont1:
331     dec I1
332     eq I1, 0, ok
333     branch lp3
335     print "ok\n"
336     end
337 err1:   set S0, "len"
338     branch err
339 err2:
340     set S0, "val"
341 err:
342     print "nok "
343     print S0
344     print " "
345     print I0
346     print " "
347     print I1
348     print " "
349     print I2
350     print " "
351     print I3
352     print " "
353     print I4
354     end
355 CODE
357 OUTPUT
359 pasm_output_is( <<'CODE', <<'OUTPUT', "clone" );
360         new P0, .IntList
361     set P0[0], 100
362     set P0[5000], 200
363     clone P1, P0
365     set I0, P0[5000]
366     eq I0, 200, ok_1
367     print "nok 1 "
368 ok_1:
369     pop I0, P0
370     eq I0, 200, ok_2
371     print "nok 2 "
372 ok_2:
373     set I0, P0
374     eq I0, 5000, ok_3
375     print "nok 3 "
376 ok_3:
377     set I0, P1[5000]
378     eq I0, 200, ok_4
379     print "nok 4 "
380 ok_4:
381     pop I0, P1
382     eq I0, 200, ok_5
383     print "nok 5 "
384 ok_5:
385     set I0, P1
386     eq I0, 5000, ok_6
387     print "nok 6 "
388     end
389 ok_6:
390     print "ok\n"
391     end
392 CODE
394 OUTPUT
396 pasm_output_is( <<'CODE', <<'OUTPUT', "access via a PMC key" );
397         new P0, .IntList
398         new P1, .Key
399         set I0, 0
401 L1:     set P1, I0
402         mul I1, I0, 2
403         set P0[P1], I1
404         inc I0
405         lt I0, 1025, L1
407         set I2, 0
408 L2:     set I3, P0[I2]
409         mul I4, I2, 2
410         ne I3, I4, BAD1
411         inc I2
412         lt I2, 1025, L2
413         print "ok 1\n"
415 GET:
416         new P2, .IntList
417         new P3, .Key
419         set I0, 0
420 L3:     set P2[I0], I0
421         inc I0
422         lt I0, 260, L3
424         set I1, 0
425 L4:     set P3, I1
426         set I2, P2[P3]
427         ne I1, I2, BAD2
428         inc I1
429         lt I1, 260, L4
430         print "ok 2\n"
431         end
433 BAD1:   print "not ok 1\n"
434         branch GET
435 BAD2:   print "not ok 2\n"
436         end
437 CODE
438 ok 1
439 ok 2
440 OUTPUT
442 pir_output_is( << 'CODE', << 'OUTPUT', "check whether interface is done" );
444 .sub _main
445     .local pmc pmc1
446     pmc1 = new IntList
447     .local int bool1
448     does bool1, pmc1, "scalar"
449     print bool1
450     print "\n"
451     does bool1, pmc1, "array"
452     print bool1
453     print "\n"
454     does bool1, pmc1, "no_interface"
455     print bool1
456     print "\n"
457     end
458 .end
459 CODE
463 OUTPUT
465 # Local Variables:
466 #   mode: cperl
467 #   cperl-indent-level: 4
468 #   fill-column: 100
469 # End:
470 # vim: expandtab shiftwidth=4: