fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / freeze.t
blob6642af38b1095ce50944b43982a2d765084dc126
1 #! perl
2 # Copyright (C) 2001-2009, Parrot Foundation.
3 # $Id$
5 use strict;
6 use warnings;
7 use lib qw( . lib ../lib ../../lib );
9 use Test::More;
10 use Parrot::Test tests => 25;
12 =head1 NAME
14 t/pmc/freeze.t - Archiving
16 =head1 SYNOPSIS
18     % prove t/pmc/freeze.t
20 =head1 DESCRIPTION
22 Tests the freeze/thaw archiving subsystem.
24 =cut
26 END { unlink "temp.fpmc"; }
28 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a Integer" );
29     new P1, ['Integer']
30     set P1, 777
31     freeze S0, P1
33     thaw P10, S0
34     typeof S10, P10
35     print S10
36     print " "
37     print P10
38     print "\n"
39     end
40 CODE
41 Integer 777
42 OUTPUT
44 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a String" );
45     new P1, ['String']
46     set P1, "foo"
47     freeze S0, P1
49     thaw P10, S0
50     typeof S10, P10
51     print S10
52     print " "
53     print P10
54     print "\n"
56     null S1
57     new P1, ['String']
58     set P1, S1
59     freeze S0, P1
60     thaw P10, S0
61     set S10, P10
62     isnull I0, S10
63     say I0
64     end
65 CODE
66 String foo
68 OUTPUT
70 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a Float" );
71     new P1, ['Float']
72     set P1, 3.14159
73     freeze S0, P1
75     thaw P10, S0
76     typeof S10, P10
77     print S10
78     print " "
79     print P10
80     print "\n"
81     end
82 CODE
83 Float 3.14159
84 OUTPUT
86 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a Hash" );
87     new P1, ['Integer']
88     set P1, 666
89     new P0, ['Hash']
90     set P0["k1"], P1
91     new P1, ['Integer']
92     set P1, 777
93     set P0["k2"], P1
94     freeze S0, P0
96     thaw P10, S0
97     typeof S10, P10
98     print S10
99     print " "
100     set I11, P10
101     print I11
102     print "\n"
103     set P12, P10["k1"]
104     print P12
105     print "\n"
106     set P12, P10["k2"]
107     print P12
108     print "\n"
109     end
110 CODE
111 Hash 2
114 OUTPUT
116 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a Hash" );
117     new P1, ['Integer']
118     set P1, 666
119     new P0, ['Hash']
120     set P0["k1"], P1
121     new P1, ['Integer']
122     set P1, 777
123     set P0["k2"], P1
124     freeze S0, P0
126     thaw P10, S0
127     typeof S10, P10
128     print S10
129     print " "
130     set I11, P10
131     print I11
132     print "\n"
133     set P12, P10["k1"]
134     print P12
135     print "\n"
136     set P12, P10["k2"]
137     print P12
138     print "\n"
139     end
140 CODE
141 Hash 2
144 OUTPUT
146 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a Integer with prop" );
147     new P1, ['Integer']
148     set P1, 666
149     new P2, ['Integer']
150     set P2, 42
151     setprop P1, "answer", P2
152     freeze S0, P1
154     thaw P10, S0
155     typeof S10, P10
156     print S10
157     print " "
158     set I11, P10
159     print I11
160     print "\n"
161     getprop P12, "answer", P10
162     print P12
163     print "\n"
164     end
165 CODE
166 Integer 666
168 OUTPUT
170 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw Array w Integer with prop" );
171     new P0, ['ResizablePMCArray']
172     new P1, ['Integer']
173     set P1, 666
174     push P0, P1
175     new P2, ['Integer']
176     set P2, 777
177     push P0, P2
178     new P3, ['Integer']
179     set P3, 42
180     setprop P1, "answer", P3
182     freeze S0, P0
184     thaw P10, S0
185     typeof S10, P10
186     print S10
187     print " "
188     set I11, P10
189     print I11
190     print "\n"
191     set P12, P10[0]
192     print P12
193     print "\n"
194     set P13, P10[1]
195     print P13
196     print "\n"
197     getprop P12, "answer", P12
198     print P12
199     print "\n"
200     end
201 CODE
202 ResizablePMCArray 2
206 OUTPUT
208 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a NULL pmc" );
209     null P0
210     freeze S0, P0
211     thaw P10, S0
212     defined I0, P10
213     unless I0, ok
214     print "not "
215 ok: print "ok\n"
216     end
217 CODE
219 OUTPUT
221 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw array w NULL pmc" );
222     new P0, ['ResizablePMCArray']
223     null P1
224     push P0, P1
225     new P1, ['Integer']
226     set P1, 10
227     push P0, P1
229     freeze S0, P0
230     thaw P10, S0
232     typeof S10, P10
233     print S10
234     print " "
235     set I11, P10
236     print I11
237     print "\n"
238     set P11, P10[0]
239     defined I0, P11
240     unless I0, ok
241     print "not "
242 ok: print "ok\n"
243     set P11, P10[1]
244     print P11
245     print "\n"
246     end
247 CODE
248 ResizablePMCArray 2
251 OUTPUT
253 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a Sub" );
254     get_global P1, "_foo"
255     freeze S0, P1
257     thaw P0, S0
258     typeof S10, P0
259     print S10
260     print "\n"
261     invokecc P0
262     print "back\n"
263     end
264 .pcc_sub _foo:
265     print "in sub _foo\n"
266     returncc
267 CODE
269 in sub _foo
270 back
271 OUTPUT
273 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a FixedPMCArray" );
274     new P0, ['FixedPMCArray']
275     set P0, 3
276     new P1, ['Integer']
277     set P1, 666
278     set P0[0], P1
279     new P2, ['Integer']
280     set P2, 777
281     set P0[1], P2
282     new P1, ['Integer']
283     set P1, 666
284     set P0[2], P1
285     freeze S0, P0
287     thaw P10, S0
288     typeof S10, P10 # type
289     print S10
290     print " "
291     set I11, P10    # elements
292     print I11
293     print "\n"
294     set P12, P10[0]
295     print P12
296     print "\n"
297     set P13, P10[1]
298     print P13
299     print "\n"
300     set P14, P10[2]
301     print P14
302     print "\n"
303     ne_addr P12, P14, ok
304     print "not "
305 ok: print "ok diff\n"
306     end
307 CODE
308 FixedPMCArray 3
312 ok diff
313 OUTPUT
315 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a FixedPMCArray" );
316     new P0, ['FixedPMCArray']
317     set P0, 3
318     new P1, ['Integer']
319     set P1, 666
320     set P0[0], P1
321     new P2, ['Integer']
322     set P2, 777
323     set P0[1], P2
324     set P0[2], P1
325     freeze S0, P0
327     thaw P10, S0
328     typeof S10, P10 # type
329     print S10
330     print " "
331     set I11, P10    # elements
332     print I11
333     print "\n"
334     set P12, P10[0]
335     print P12
336     print "\n"
337     set P13, P10[1]
338     print P13
339     print "\n"
340     set P14, P10[2]
341     print P14
342     print "\n"
343     eq_addr P12, P14, ok
344     print "not "
345 ok: print "ok same\n"
346     end
347 CODE
348 FixedPMCArray 3
352 ok same
353 OUTPUT
355 pir_output_is( <<'CODE', <<'OUTPUT', "freeze class" );
356 .const string fpmc = 'temp.fpmc'
357 .sub 'main' :main
358     $P10 = newclass "Foo"
359     $S10 = $P10
360     print $S10
361     print "\n"
362     freeze $S11, $P10
363     print "ok 1\n"
365     $P0 = new ['FileHandle']
366     $P0.'open'(fpmc, 'w')
367     $P0.'print'($S11)
368     $P0.'close'()
369     print "ok 2\n"
370 .end
371 CODE
373 ok 1
374 ok 2
375 OUTPUT
377 pir_output_is( <<'CODE', <<'OUTPUT', "thaw class into new interpreter" );
378 .const string fpmc = "temp.fpmc"
379 .sub 'main' :main
380     $P0 = new ['FileHandle']
381     $P0.'open'(fpmc, 'r')
382     if $P0 goto ok1
384     .include 'stdio.pasm'
385     $P0 = getinterp
386     $P1 = $P0.'stdhandle'(.PIO_STDERR_FILENO)
387     $P1.'print'("couldn't open fpmc for reading")
388     exit 1
390 ok1:
391     $S3 = $P0.'readall'()
392     $P0.'close'()
393     print "ok 1\n"
394     $P4 = thaw $S3
395     print "ok 2\n"
396     $S10 = $P4
397     print $S10
398     print "\n"
399 .end
400 CODE
401 ok 1
402 ok 2
404 OUTPUT
406 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw simple class" );
407     newclass P10, "Foo"
408     set S10, P10
409     print S10
410     print "\n"
411     freeze S11, P10
413     thaw P4, S11
414     print "ok\n"
415     set S12, P4
416     print S12
417     print "\n"
418     end
419 CODE
423 OUTPUT
425 pir_output_is( <<'CODE', <<'OUTPUT', "freeze class w attr" );
426 .const string fpmc = 'temp.fpmc'
427 .sub 'main' :main
428     $P10 = newclass "Foo"
429     addattribute $P10, ".aa"
430     $S10 = $P10
431     print $S10
432     print "\n"
433     $S11 = freeze $P10
434     print "ok 1\n"
436     $P0 = new ['FileHandle']
437     $P0.'open'(fpmc, 'w')
438     $P0.'print'($S11)
439     $P0.'close'()
440     print "ok 2\n"
441 .end
442 CODE
444 ok 1
445 ok 2
446 OUTPUT
448 pir_output_is( <<'CODE', <<'OUTPUT', "thaw class w attr into new interpreter" );
449 .const string fpmc = "temp.fpmc"
450 .sub 'main' :main
451     $P0 = new ['FileHandle']
452     $P0.'open'(fpmc, 'r')
453     if $P0 goto ok1
455     .include 'stdio.pasm'
456     $P0 = getinterp
457     $P1 = $P0.'stdhandle'(.PIO_STDERR_FILENO)
458     $P1.'print'("couldn't open fpmc for reading\n")
459     exit 1
461 ok1:
462     $S3 = $P0.'readall'()
463     $P0.'close'()
464     print "ok 1\n"
466     $P4 = thaw $S3
467     print "ok 2\n"
469     $S10 = $P4
470     print $S10
471     print "\n"
473     $P5 = new $S10
474     print "ok 3\n"
476     $P6 = new ['String']
477     $P6 = "ok 5\n"
479     setattribute $P5, '.aa', $P6
480     print "ok 4\n"
482     $P7 = getattribute $P5, '.aa'
483     print $P7
484 .end
485 CODE
486 ok 1
487 ok 2
489 ok 3
490 ok 4
491 ok 5
492 OUTPUT
494 pir_output_is( <<'CODE', <<'OUTPUT', "thaw class w attr same interp" );
495 .const string fpmc = 'temp.fpmc'
496 .sub 'main' :main
497     $P10 = newclass "Foo"
498     addattribute $P10, ".aa"
499     addattribute $P10, ".bb"
500     $S10 = $P10
501     print $S10
502     print "\n"
504     $S3 = freeze $P10
505     $P0 = new ['FileHandle']
506     $P0.'open'(fpmc, 'w')
507     $P0.'print'($S3)
508     $P0.'close'()
509     print "ok 1\n"
511     $P4 = thaw $S3
512     print "ok 2\n"
514     $S10 = $P4
515     print $S10
516     print "\n"
518     $P5 = new $S10
519     print "ok 3\n"
521     $P6 = new ['String']
522     $P6 = "ok 5\n"
523     setattribute $P5, ["Foo"], ".aa", $P6
525     $P6 = new ['String']
526     $P6 = "ok 6\n"
527     setattribute $P5, ["Foo"], ".bb", $P6
528     print "ok 4\n"
530     $P7 = getattribute $P5, ".aa"
531     print $P7
532     $P7 = getattribute $P5, ".bb"
533     print $P7
534 .end
535 CODE
537 ok 1
538 ok 2
540 ok 3
541 ok 4
542 ok 5
543 ok 6
544 OUTPUT
546 pir_output_is( <<'CODE', <<'OUTPUT', "thaw object w attr into same interpreter" );
547 .const string fpmc = 'temp.fpmc'
548 .sub 'main' :main
549     $P10 = newclass "Foo"
550     addattribute $P10, ".aa"
551     addattribute $P10, ".bb"
553     $P10 = new ['Foo']
554     $S3 = freeze $P10
555     print "ok 1\n"
556     $P0 = new ['FileHandle']
557     $P0.'open'(fpmc, 'w')
558     $P0.'print'($S3)
559     $P0.'close'()
561     $P5 = thaw $S3
562     print "ok 2\n"
564     $S10 = typeof $P5
565     print $S10
566     print "\n"
568     print "ok 3\n"
569     $P6 = new ['String']
570     $P6 = "ok 5\n"
571     setattribute $P5, ["Foo"], ".aa", $P6
572     $P6 = new ['String']
573     $P6 = "ok 6\n"
574     setattribute $P5, ["Foo"], ".bb", $P6
575     print "ok 4\n"
577     $P7 = getattribute $P5, ".aa"
578     print $P7
579     $P7 = getattribute $P5, ".bb"
580     print $P7
581 .end
582 CODE
583 ok 1
584 ok 2
586 ok 3
587 ok 4
588 ok 5
589 ok 6
590 OUTPUT
592 pir_output_is( <<'CODE', <<'OUTPUT', "thaw object w attr into new interpreter" );
593 .const string fpmc = 'temp.fpmc'
594 .sub 'main' :main
595     $P0 = new ['FileHandle']
596     $P0.'open'(fpmc, 'r')
597     if $P0 goto ok1
599     .include 'stdio.pasm'
600     $P0 = getinterp
601     $P1 = $P0.'stdhandle'(.PIO_STDERR_FILENO)
602     $P1.'print'("open failed\n")
604 ok1:
605     $S3 = $P0.'readall'()
606     $P0.'close'()
608     $P5 = thaw $S3
609     print "ok 2\n"
610     $S10 = typeof $P5
611     print $S10
612     print "\n"
614     print "ok 3\n"
615     $P6 = new ['String']
616     $P6 = "ok 5\n"
617     setattribute $P5, ["Foo"], ".aa", $P6
619     $P6 = new ['String']
620     $P6 = "ok 6\n"
621     setattribute $P5, ["Foo"], ".bb", $P6
623     print "ok 4\n"
624     $P7 = getattribute $P5, ".aa"
625     print $P7
627     $P7 = getattribute $P5, ".bb"
628     print $P7
629 .end
630 CODE
631 ok 2
633 ok 3
634 ok 4
635 ok 5
636 ok 6
637 OUTPUT
639 pasm_output_is( <<'CODE', <<'OUTPUT', "freeze Key" );
640     new P0, ['Hash']
641     new P1, ['FixedPMCArray']
642     set P1, 2
643     set P1[1], P0
644     set P0["foo"], "ok\n"
645     set S0, P1[1; "foo"]
646     print S0
648     new P3, ['Key']
649     set P3, 1
650     new P4, ['Key']
651     set P4, "foo"
652     push P3, P4
654     set S0, P1[P3]
655     print S0
657     freeze S0, P3
658     print "ok 1\n"
659     thaw P5, S0
660     print "ok 2\n"
662     set S0, P1[P5]
663     print S0
664     end
665 CODE
668 ok 1
669 ok 2
671 OUTPUT
673 pir_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a ResizableBooleanArray" );
674 .sub test :main
675     .local pmc original_arr, thawed_arr
676     .local string frozen_arr
677     original_arr = new ['ResizableBooleanArray']
678     set original_arr, 666
679     original_arr[555] = 777
681     # Dump some data before freezing
682     print "Before freezing:\n"
683     typeof $S10, original_arr   # type
684     print $S10
685     print "\n"
686     set $I12, original_arr  # elements
687     print $I12
688     print "\n"
689     $I12 = original_arr[554]
690     print $I12
691     print "\n"
692     $I12 = original_arr[555]
693     print $I12
694     print "\n"
695     $I12 = original_arr[556]
696     print $I12
697     print "\n"
699     frozen_arr = freeze original_arr
700     thawed_arr = thaw frozen_arr
702     # Dump the same data after freeze/thaw
703     print "\nAfter freeze/thaw:\n"
704     typeof $S10, thawed_arr # type
705     print $S10
706     print "\n"
707     set $I12, thawed_arr    # elements
708     print $I12
709     print "\n"
710     $I12 = thawed_arr[554]
711     print $I12
712     print "\n"
713     $I12 = thawed_arr[555]
714     print $I12
715     print "\n"
716     $I12 = thawed_arr[556]
717     print $I12
718     print "\n"
720 .end
721 CODE
722 Before freezing:
723 ResizableBooleanArray
729 After freeze/thaw:
730 ResizableBooleanArray
735 OUTPUT
737 pir_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a ResizablePMCArray" );
738 .sub test :main
739     .local pmc original_arr, thawed_arr
740     .local string frozen_arr
741     original_arr = new ['ResizablePMCArray']
742     original_arr[0] = 1
743     original_arr[1] = 2.72
744     original_arr[2] = "three.14"
746     # Dump some data before freezing
747     print "Before freezing:\n"
748     typeof $S10, original_arr    # type
749     print $S10
750     print "\n"
751     set $I12, original_arr   # elements
752     print $I12
753     print "\n"
754     $I12 = original_arr[0]
755     print $I12
756     print "\n"
757     $N12 = original_arr[1]
758     print $N12
759     print "\n"
760     $S12 = original_arr[2]
761     print $S12
762     print "\n"
764     frozen_arr = freeze original_arr
765     thawed_arr = thaw frozen_arr
767     # Dump the same data after freeze/thaw
768     print "\nAfter freeze/thaw:\n"
769     typeof $S10, thawed_arr  # type
770     print $S10
771     print "\n"
772     set $I12, thawed_arr # elements
773     print $I12
774     print "\n"
775     $I12 = thawed_arr[0]
776     print $I12
777     print "\n"
778     $N12 = thawed_arr[1]
779     print $N12
780     print "\n"
781     $S12 = thawed_arr[2]
782     print $S12
783     print "\n"
785 .end
786 CODE
787 Before freezing:
788 ResizablePMCArray
791 2.72
792 three.14
794 After freeze/thaw:
795 ResizablePMCArray
798 2.72
799 three.14
800 OUTPUT
802 pir_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw a Conure" );
803 .sub main :main
804     .local pmc cl, o
805     cl = newclass 'Conure'
806     addattribute cl, 'temperature'
807     o = new ['Conure']
808     $S0 = freeze o
809     $P1 = thaw $S0
810     $P2 = getattribute $P1, 'temperature'
811     say $P2
812 .end
814 .namespace ['Conure']
815 .sub init :method :vtable
816     $P0 = new ['Integer']
817     $P0 = 37
818     setattribute self, 'temperature', $P0
819 .end
820 CODE
822 OUTPUT
824 pir_output_is( <<'CODE', <<'OUTPUT', "freeze/thaw obj of class w Hash attrs" );
825 .sub main :main
826     .local pmc cl, o
827     #cl = subclass 'Hash', 'OPTable'
828     cl = newclass 'OPTable'
829     addattribute cl, '%!key'
830     addattribute cl, '%!klen'
831     addattribute cl, '&!ws'
832     o = new ['OPTable']
833     o."init"()
834     o."test"()
835     $S0 = freeze o
836     $P1 = thaw $S0
837     $P1."test"()
838 .end
840 .namespace [ "OPTable" ]
842 .sub "init" :method :vtable
843     .local pmc keytable, klentable
844     keytable = new ['Hash']
845     klentable = new ['Hash']
846     setattribute self, '%!key', keytable
847     setattribute self, '%!klen', klentable
848 .end
850 .sub "init" :method
851     .local pmc keytable, klentable
852     keytable = getattribute self, '%!key'
853     keytable['bar'] = 1
854     keytable['foobar'] = 2
855     klentable = getattribute self, '%!klen'
856     klentable['bar'] = 3
857     klentable['foobar'] = 6
858 .end
860 .sub "test" :method
861     .local pmc keytable, klentable
862     keytable = getattribute self, "%!key"
863     $I0 = keytable['bar']
864     print $I0
865     print ' '
866     $I0 = keytable['foobar']
867     print $I0
868     print ' '
869     klentable = getattribute self, "%!klen"
870     $I0 = klentable['bar']
871     print $I0
872     print ' '
873     $I0 = klentable['foobar']
874     say $I0
875 .end
876 CODE
877 1 2 3 6
878 1 2 3 6
879 OUTPUT
881 # Local Variables:
882 #   mode: cperl
883 #   cperl-indent-level: 4
884 #   fill-column: 100
885 # End:
886 # vim: expandtab shiftwidth=4: