tagged release 0.6.4
[parrot.git] / t / pmc / resizablefloatarray.t
blob1e20fd2c90f23ccfcc017faf3b9f134a05a6ad8a
1 #! perl
2 # Copyright (C) 2001-2007, 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 => 19;
11 =head1 NAME
13 t/pmc/resizablefloatarray.t - ResizableFloatArray PMC
15 =head1 SYNOPSIS
17     % prove t/pmc/resizablefloatarray.t
19 =head1 DESCRIPTION
21 Tests C<ResizableFloatArray> PMC. Checks size, sets various elements, including
22 out-of-bounds test. Checks INT and PMC keys.
24 =cut
26 my $fp_equality_macro = pasm_fp_equality_macro();
28 pasm_output_is( <<'CODE', <<'OUTPUT', 'creation' );
29     new P0, 'ResizableFloatArray'
30     print "ok\n"
31     end
32 CODE
34 OUTPUT
36 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting array size" );
37     new P0, 'ResizableFloatArray'
39     set I0,P0
40     eq I0,0,OK_1
41     print "not "
42 OK_1:    print "ok 1\n"
44     set P0,1
45     set I0,P0
46     eq I0,1,OK_2
47     print "not "
48 OK_2:    print "ok 2\n"
50     set P0,5
51     set I0,P0
52     eq I0,5,OK_3
53     print "not "
54 OK_3:    print "ok 3\n"
56     set P0,9
57     set I0,P0
58     eq I0,9,OK_4
59     print "not "
60 OK_4:    print "ok 4\n"
62     set P0,7
63     set I0,P0
64     eq I0,7,OK_5
65     print "not "
66 OK_5:    print "ok 5\n"
68         end
69 CODE
70 ok 1
71 ok 2
72 ok 3
73 ok 4
74 ok 5
75 OUTPUT
77 pasm_error_output_like( <<'CODE', <<'OUTPUT', "Setting negative array size" );
78     new P0, 'ResizableFloatArray'
79         set P0, -100
80         end
81 CODE
82 /ResizableFloatArray: Can't resize to negative value!/
83 OUTPUT
85 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting first element" );
86     new P0, 'ResizableFloatArray'
87     set P0, 1
89     set P0[0],-7
90     set I0,P0[0]
91     eq I0,-7,OK_1
92     print "not "
93 OK_1:    print "ok 1\n"
95     set P0[0],3.7
96     set N0,P0[0]
97     eq N0,3.7,OK_2
98     print "not "
99 OK_2:    print "ok 2\n"
101     set P0[0],"17.2"
102     set S0,P0[0]
103     eq S0,"17.2",OK_3
104     print "not "
105 OK_3:    print "ok 3\n"
107     end
108 CODE
109 ok 1
110 ok 2
111 ok 3
112 OUTPUT
114 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting second element" );
115     new P0, 'ResizableFloatArray'
117     set P0[1], -7
118     set I0, P0[1]
119     eq I0,-7,OK_1
120     print "not "
121 OK_1:    print "ok 1\n"
123     set P0[1], 3.7
124     set N0, P0[1]
125     eq N0,3.7,OK_2
126     print "not "
127 OK_2:    print "ok 2\n"
129     set P0[1],"17.1"
130     set S0, P0[1]
131     eq S0,"17.1",OK_3
132     print "not "
133 OK_3:    print "ok 3\n"
135     end
136 CODE
137 ok 1
138 ok 2
139 ok 3
140 OUTPUT
142 # RT#46823: Rewrite these properly when we have exceptions
144 pasm_output_is( <<'CODE', <<'OUTPUT', "Setting out-of-bounds elements" );
145     new P0, 'ResizableFloatArray'
146     set P0, 1
148     set P0[1], -7
149     print "ok 1\n"
151     end
152 CODE
153 ok 1
154 OUTPUT
156 pasm_output_is( <<'CODE', <<'OUTPUT', "Getting out-of-bounds elements" );
157     new P0, 'ResizableFloatArray'
158     set P0, 1
160     set I0, P0[1]
161     print "ok 1\n"
162     end
163 CODE
164 ok 1
165 OUTPUT
167 pasm_output_is( <<"CODE", <<'OUTPUT', "Set via PMC keys, access via INTs" );
168 @{[ $fp_equality_macro ]}
169      new P0, 'ResizableFloatArray'
170      new P1, 'Key'
172      set P1, 0
173      set P0[P1], 25
175      set P1, 1
176      set P0[P1], 2.5
178      set P1, 2
179      set P0[P1], "17.32"
181      set I0, P0[0]
182      eq I0, 25, OK1
183      print "not "
184 OK1: print "ok 1\\n"
186      set N0, P0[1]
187      .fp_eq(N0, 2.5, OK2)
188      print "not "
189 OK2: print "ok 2\\n"
191      set S0, P0[2]
192      eq S0, "17.32", OK3
193      print "not "
194 OK3: print "ok 3\\n"
196      end
197 CODE
198 ok 1
199 ok 2
200 ok 3
201 OUTPUT
203 pasm_output_is( <<"CODE", <<'OUTPUT', "Set via INTs, access via PMC Keys" );
204 @{[ $fp_equality_macro ]}
205      new P0, 'ResizableFloatArray'
206      set P0, 1
208      set P0[25], 125
209      set P0[128], 10.2
210      set P0[513], "17.3"
211      new P1, 'Integer'
212      set P1, 123456
213      set P0[1023], P1
215      new P2, 'Key'
216      set P2, 25
217      set I0, P0[P2]
218      eq I0, 125, OK1
219      print "not "
220 OK1: print "ok 1\\n"
222      set P2, 128
223      set N0, P0[P2]
224      .fp_eq(N0, 10.2, OK2)
225      print "not "
226 OK2: print "ok 2\\n"
228      set P2, 513
229      set S0, P0[P2]
230      eq S0, "17.3", OK3
231      print "not "
232 OK3: print "ok 3\\n"
234      set P2, 1023
235      set P3, P0[P2]
236      set I1, P3
237      eq I1, 123456, OK4
238      print "not "
239 OK4: print "ok 4\\n"
241      end
242 CODE
243 ok 1
244 ok 2
245 ok 3
246 ok 4
247 OUTPUT
249 pasm_output_is( <<"CODE", <<'OUTPUT', 'basic push' );
250 @{[ $fp_equality_macro ]}
251      new P0, 'ResizableFloatArray'
252      push P0, 1.0
253      push P0, 2.0
254      push P0, 3.0
255      set N0, P0[0]
256      .fp_eq(N0, 1.0, OK1)
257      print "not "
258 OK1: print "ok 1\\n"
260      set N0, P0[1]
261      .fp_eq(N0, 2.0, OK2)
262      print "not "
263 OK2: print "ok 2\\n"
265      set N0, P0[2]
266      .fp_eq(N0, 3.0, OK3)
267      print "not "
268 OK3: print "ok 3\\n"
269      end
270 CODE
271 ok 1
272 ok 2
273 ok 3
274 OUTPUT
276 pasm_output_is( <<"CODE", <<'OUTPUT', 'push many values' );
277 @{[ $fp_equality_macro ]}
278      new P0, 'ResizableFloatArray'
279      set I0, 0
280 L1:  set N0, I0
281      push P0, N0
282      inc I0
283      lt I0, 100000, L1
285      set N0, P0[99999]
286      .fp_eq(N0, 99999.0, OK1)
287      print N0
288      print "not "
289 OK1: print "ok 1\\n"
290      end
291 CODE
292 ok 1
293 OUTPUT
295 pasm_output_is( <<"CODE", <<'OUTPUT', 'basic pop' );
296 @{[ $fp_equality_macro ]}
297      new P0, 'ResizableFloatArray'
298      set P0[0], 1.0
299      set P0[1], 2.0
300      set P0[2], 3.0
301      pop N0, P0
302      .fp_eq(N0, 3.0, OK1)
303      print "not "
304 OK1: print "ok 1\\n"
306      pop N0, P0
307      .fp_eq(N0, 2.0, OK2)
308      print "not "
309 OK2: print "ok 2\\n"
311      pop N0, P0
312      .fp_eq(N0, 1.0, OK3)
313      print "not "
314 OK3: print "ok 3\\n"
315      end
316 CODE
317 ok 1
318 ok 2
319 ok 3
320 OUTPUT
322 pasm_output_is( <<"CODE", <<'OUTPUT', 'pop many values' );
323 @{[ $fp_equality_macro ]}
324      new P0, 'ResizableFloatArray'
325      set I0, 0
326 L1:  set N0, I0
327      set P0[I0], N0
328      inc I0
329      lt I0, 100000, L1
331 L2:  dec I0
332      set N1, I0
333      pop N0, P0
334      .fp_eq(N0, N1, OK)
335      branch NOT_OK
336 OK:  gt I0, 0, L2
337      print "ok\\n"
338      end
340 NOT_OK:
341      print N0
342      print "\\n"
343      print N1
344      print "\\n"
345      end
346 CODE
348 OUTPUT
350 pasm_output_is( <<"CODE", <<'OUTPUT', 'push/pop' );
351 @{[ $fp_equality_macro ]}
352      new P0, 'ResizableFloatArray'
353      push P0, 1.0
354      push P0, 2.0
355      push P0, 3.0
356      pop N0, P0
357      .fp_eq(N0, 3.0, OK1)
358      print "not "
359 OK1: print "ok 1\\n"
360      end
361 CODE
362 ok 1
363 OUTPUT
365 pasm_error_output_like( <<'CODE', <<'OUTPUT', 'pop from empty array' );
366      new P0, 'ResizableFloatArray'
367      pop N0, P0
368      end
369 CODE
370 /ResizableFloatArray: Can't pop from an empty array!/
371 OUTPUT
373 pir_output_is( << 'CODE', << 'OUTPUT', "check whether interface is done" );
375 .sub _main
376     .local pmc pmc1
377     pmc1 = new 'ResizableFloatArray'
378     .local int bool1
379     does bool1, pmc1, "scalar"
380     print bool1
381     print "\n"
382     does bool1, pmc1, "array"
383     print bool1
384     print "\n"
385     does bool1, pmc1, "no_interface"
386     print bool1
387     print "\n"
388     end
389 .end
390 CODE
394 OUTPUT
396 pir_output_is( << 'CODE', << 'OUTPUT', "push float" );
398 .sub _main
399     .local pmc pmc1
400     pmc1 = new 'ResizableFloatArray'
401     pmc1[9999] = 10000.10000
402     push pmc1, 123.123
403     .local int elements
404     elements = pmc1
405     print elements
406     print "\n"
407     .local string last
408     last = pmc1[10000]
409     print last
410     print "\n"
411     end
412 .end
413 CODE
414 10001
415 123.123
416 OUTPUT
418 pir_output_is( << 'CODE', << 'OUTPUT', "shift float" );
419 .sub test :main
420     .local pmc ar
421     ar = new 'ResizableFloatArray'
422     ar[0] = 10.1
423     ar[1] = 20.2
424     $I0 = elements ar
425     print $I0
426     print ' '
427     $N0 = shift ar
428     print $N0
429     print ' '
430     $I0 = elements ar
431     print $I0
432     print ' '
433     $N0 = shift ar
434     print $N0
435     print ' '
436     $I0 = elements ar
437     print $I0
438     print "\n"
439 .end
440 CODE
441 2 10.100000 1 20.200000 0
442 OUTPUT
444 pir_output_is( << 'CODE', << 'OUTPUT', "unshift float" );
445 .sub test :main
446     .local pmc ar
447     ar = new 'ResizableFloatArray'
448     unshift ar, 10.1
449     unshift ar, 20.2
450     $I0 = elements ar
451     print $I0
452     print ' '
453     $N0 = ar[0]
454     print $N0
455     print ' '
456     $N0 = ar[1]
457     print $N0
458     print "\n"
459 .end
460 CODE
461 2 20.200000 10.100000
462 OUTPUT
464 # Local Variables:
465 #   mode: cperl
466 #   cperl-indent-level: 4
467 #   fill-column: 100
468 # End:
469 # vim: expandtab shiftwidth=4: