* src/pmc/scalar.pmc:
[parrot.git] / t / pmc / fixedpmcarray.t
blobab64900493662b0688bc718982552042839a9a65
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 Parrot::Test tests => 14;
9 use Test::More;
11 =head1 NAME
13 t/pmc/fixedpmcarray.t - FixedPMCArray PMC
15 =head1 SYNOPSIS
17     % prove t/pmc/fixedpmcarray.t
19 =head1 DESCRIPTION
21 Tests C<FixedPMCArray> 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,.FixedPMCArray
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, .FixedPMCArray
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 /FixedPMCArray: Can't resize!
101 current instr\.:/
102 OUTPUT
104 #VIM's syntax highlighter needs this line
106 pasm_output_is( <<'CODE', <<'OUTPUT', "Truth and falsehood" );
107         new P0, .FixedPMCArray
109         set P0, 0
110         if P0, NOK_1
111         branch OK_1
112 NOK_1:  print "not "
113 OK_1:   print "ok 1\n"
114         unless P0, OK_2
115         print "not "
116 OK_2:   print "ok 2\n"
118         set P0, 1
119         unless P0, NOK_3
120         branch OK_3
121 NOK_3:  print "not "
122 OK_3:   print "ok 3\n"
123         if P0, OK_4
124         print "not "
125 OK_4:   print "ok 4\n"
127         end
128 CODE
129 ok 1
130 ok 2
131 ok 3
132 ok 4
133 OUTPUT
135 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting first element" );
136         new P0, .FixedPMCArray
137         set P0, 1
139     set P0[0],-7
140     set I0,P0[0]
141     eq I0,-7,OK_1
142     print "not "
143 OK_1:    print "ok 1\n"
145     set P0[0],3.7
146     set N0,P0[0]
147     eq N0,3.7,OK_2
148     print "not "
149 OK_2:    print "ok 2\n"
151     set P0[0],"muwhahaha"
152     set S0,P0[0]
153     eq S0,"muwhahaha",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_is( <<'CODE', <<'OUTPUT', "Setting second element" );
165         new P0, .FixedPMCArray
166         set P0, 2
168     set P0[1], -7
169     set I0, P0[1]
170     eq I0,-7,OK_1
171     print "not "
172 OK_1:    print "ok 1\n"
174     set P0[1], 3.7
175     set N0, P0[1]
176     eq N0,3.7,OK_2
177     print "not "
178 OK_2:    print "ok 2\n"
180     set P0[1],"purple"
181     set S0, P0[1]
182     eq S0,"purple",OK_3
183     print "not "
184 OK_3:    print "ok 3\n"
186     end
187 CODE
188 ok 1
189 ok 2
190 ok 3
191 OUTPUT
193 # TODO: Rewrite these properly when we have exceptions
195 pasm_output_like( <<'CODE', <<'OUTPUT', "Setting out-of-bounds elements" );
196         new P0, .FixedPMCArray
197         set P0, 1
199     set P0[1], -7
201     end
202 CODE
203 /FixedPMCArray: index out of bounds!
204 current instr\.:/
205 OUTPUT
207 pasm_output_like( <<'CODE', <<'OUTPUT', "Getting out-of-bounds elements" );
208         new P0, .FixedPMCArray
209         set P0, 1
211     set I0, P0[1]
212     end
213 CODE
214 /FixedPMCArray: index out of bounds!
215 current instr\.:/
216 OUTPUT
218 pasm_output_is( <<"CODE", <<'OUTPUT', "Set via PMC keys, access via INTs" );
219 @{[ $fp_equality_macro ]}
220      new P0, .FixedPMCArray
221      set P0, 3
222      new P1, .Key
224      set P1, 0
225      set P0[P1], 25
227      set P1, 1
228      set P0[P1], 2.5
230      set P1, 2
231      set P0[P1], "bleep"
233      set I0, P0[0]
234      eq I0, 25, OK1
235      print "not "
236 OK1: print "ok 1\\n"
238      set N0, P0[1]
239      .fp_eq(N0, 2.5, OK2)
240      print "not "
241 OK2: print "ok 2\\n"
243      set S0, P0[2]
244      eq S0, "bleep", OK3
245      print "not "
246 OK3: print "ok 3\\n"
248      end
249 CODE
250 ok 1
251 ok 2
252 ok 3
253 OUTPUT
255 pasm_output_is( <<"CODE", <<'OUTPUT', "Set via INTs, access via PMC Keys" );
256 @{[ $fp_equality_macro ]}
257      new P0, .FixedPMCArray
258      set P0, 1024
260      set P0[25], 125
261      set P0[128], 10.2
262      set P0[513], "cow"
263      new P1, .Integer
264      set P1, 123456
265      set P0[1023], P1
267      new P2, .Key
268      set P2, 25
269      set I0, P0[P2]
270      eq I0, 125, OK1
271      print "not "
272 OK1: print "ok 1\\n"
274      set P2, 128
275      set N0, P0[P2]
276      .fp_eq(N0, 10.2, OK2)
277      print "not "
278 OK2: print "ok 2\\n"
280      set P2, 513
281      set S0, P0[P2]
282      eq S0, "cow", OK3
283      print "not "
284 OK3: print "ok 3\\n"
286      set P2, 1023
287      set P3, P0[P2]
288      set I1, P3
289      eq I1, 123456, OK4
290      print "not "
291 OK4: print "ok 4\\n"
293      end
294 CODE
295 ok 1
296 ok 2
297 ok 3
298 ok 4
299 OUTPUT
301 pir_output_like(
302     <<'CODE',
304 .sub main :main
305      .local pmc compares, cmp_fun
306      # XXX doesnt work wit prederef of JIT
307      bounds 1
308      compares = new .Integer
309      compares = 0
310      global "compares" = compares
311     cmp_fun = global "cmp_fun"
312      sort_ar()
313      sort_ar(cmp_fun)
314 .end
315 .sub sort_ar
316     .param pmc cmp_fun :optional
317     .local pmc compares
318     compares = global "compares"
319     compares = 0
320     .local pmc ar
321     new ar, .FixedPMCArray
322     ar = 5
323     ar[0] = 10
324     ar[1] = 2
325     ar[2] = 5
326     ar[3] = 9
327     ar[4] = 1
328     ar."sort"(cmp_fun)
329     print "ok 1\n"
331     .local pmc it
332     iter it, ar
334     unless it goto done
335     $P0 = shift it
336     print $P0
337     print " "
338     goto lp
339 done:
340     print "x\n"
341      print "compares: "
342      print compares
343      print "\n"
344 .end
346 .sub cmp_fun
347     .param pmc a
348     .param pmc b
349     $I0 = cmp a, b
350     .local pmc compares
351     compares = global "compares"
352     inc compares
353     .pcc_begin_return
354     .return $I0
355     .pcc_end_return
356 .end
357 CODE
359     qr/ok 1
360 1 2 5 9 10 x
361 compares: 0
362 ok 1
363 1 2 5 9 10 x
364 compares: [1-9]\d*/, "sort"
367 pir_output_is( << 'CODE', << 'OUTPUT', "check whether interface is done" );
369 .sub _main
370     .local pmc pmc1
371     pmc1 = new FixedPMCArray
372     .local int bool1
373     does bool1, pmc1, "scalar"
374     print bool1
375     print "\n"
376     does bool1, pmc1, "array"
377     print bool1
378     print "\n"
379     does bool1, pmc1, "no_interface"
380     print bool1
381     print "\n"
382     end
383 .end
384 CODE
388 OUTPUT
390 pir_output_like( <<'CODE', <<'OUTPUT', "Getting unitialized elements" );
392 .sub main :main
393     .local pmc arr1
394     arr1 = new FixedPMCArray
395     arr1 = 2005
396     .local pmc elem_1956
397     elem_1956 = arr1[1956]
398     .local string type_1956
399     type_1956 = typeof elem_1956
400     print type_1956
401 .end
402 CODE
403 /Null PMC access in name()/
404 OUTPUT
406 pir_output_is( << 'CODE', << 'OUTPUT', "Multi keys" );
408 .sub test :main
409     .local pmc    matrix, row
410     .local pmc    elem_in_pmc
411     .local pmc    elem_out_pmc
412     .local int    elem_out_int
413     .local num    elem_out_num
414     .local string elem_out_string
416     matrix = new FixedPMCArray
417     matrix = 1
418     row = new FixedPMCArray
419     row = 4           # assing with an integer, number, pmc, string
420     matrix[0] = row
421     matrix[0;0] = 128
422     matrix[0;1] = 128.128
423     elem_in_pmc = new Integer
424     elem_in_pmc = 256
425     matrix[0;2] = elem_in_pmc
426     matrix[0;3] = "asdf"
428     elem_out_int = matrix[0;0]
429     print "set_integer_keyed, get_integer_keyed: "
430     print elem_out_int
431     print "\n"
433     print "set_integer_keyed, get_pmc_keyed: "
434     elem_out_pmc = matrix[0;0]
435     print elem_out_pmc
436     print "\n"
438     print "set_integer_keyed, get_number_keyed: "
439     elem_out_num = matrix[0;0]
440     print elem_out_num
441     print "\n"
443     print "set_integer_keyed, get_string_keyed: "
444     elem_out_string = matrix[0;0]
445     print elem_out_string
446     print "\n"
448     print "set_number_keyed, get_pmc_keyed: "
449     elem_out_pmc = matrix[0;1]
450     print elem_out_pmc
451     print "\n"
453     print "set_number_keyed, get_number_keyed: "
454     elem_out_num = matrix[0;1]
455     print elem_out_num
456     print "\n"
458     print "set_number_keyed, get_string_keyed: "
459     elem_out_string = matrix[0;1]
460     print elem_out_string
461     print "\n"
463     elem_out_int = matrix[0;2]
464     print "set_pmc_keyed, get_integer_keyed: "
465     print elem_out_int
466     print "\n"
468     print "set_pmc_keyed, get_pmc_keyed: "
469     elem_out_pmc = matrix[0;2]
470     print elem_out_pmc
471     print "\n"
473     print "set_pmc_keyed, get_number_keyed: "
474     elem_out_num = matrix[0;2]
475     print elem_out_num
476     print "\n"
478     print "set_pmc_keyed, get_string_keyed: "
479     elem_out_string = matrix[0;2]
480     print elem_out_string
481     print "\n"
483     elem_out_int = matrix[0;0]
484     print "set_integer_keyed, get_integer_keyed: "
485     print elem_out_int
486     print "\n"
488     print "set_integer_keyed, get_pmc_keyed: "
489     elem_out_pmc = matrix[0;0]
490     print elem_out_pmc
491     print "\n"
493     print "set_integer_keyed, get_number_keyed: "
494     elem_out_num = matrix[0;0]
495     print elem_out_num
496     print "\n"
498     print "set_integer_keyed, get_string_keyed: "
499     elem_out_string = matrix[0;0]
500     print elem_out_string
501     print "\n"
503 .end
504 CODE
505 set_integer_keyed, get_integer_keyed: 128
506 set_integer_keyed, get_pmc_keyed: 128
507 set_integer_keyed, get_number_keyed: 128.000000
508 set_integer_keyed, get_string_keyed: 128
509 set_number_keyed, get_pmc_keyed: 128.128
510 set_number_keyed, get_number_keyed: 128.128000
511 set_number_keyed, get_string_keyed: 128.128
512 set_pmc_keyed, get_integer_keyed: 256
513 set_pmc_keyed, get_pmc_keyed: 256
514 set_pmc_keyed, get_number_keyed: 256.000000
515 set_pmc_keyed, get_string_keyed: 256
516 set_integer_keyed, get_integer_keyed: 128
517 set_integer_keyed, get_pmc_keyed: 128
518 set_integer_keyed, get_number_keyed: 128.000000
519 set_integer_keyed, get_string_keyed: 128
520 OUTPUT
522 pir_output_is( <<'CODE', <<'OUTPUT', "defined" );
523 .sub main :main
524     .local pmc arr1
525     arr1 = new FixedPMCArray
526     arr1 = 2005
527     .local int defined_elem_1956
528     defined_elem_1956 = defined arr1[1956]
529     print defined_elem_1956
530     arr1[1956] = 42
531     defined_elem_1956 = defined arr1[1956]
532     print defined_elem_1956
533     .local pmc val
534     null val
535     arr1[1956] = val
536     defined_elem_1956 = defined arr1[1956]
537     print defined_elem_1956
538     print "\n"
539 .end
540 CODE
542 OUTPUT
544 # Local Variables:
545 #   mode: cperl
546 #   cperl-indent-level: 4
547 #   fill-column: 100
548 # End:
549 # vim: expandtab shiftwidth=4: