[TT #871] Update native_pbc tests with the mk_native_pbc utility
[parrot.git] / t / dynpmc / dynlexpad.t
blobcb2139179879ee07e4bd1212ea249bf18082ba18
1 #! perl
2 # Copyright (C) 2005-2007, Parrot 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 => 7;
10 use Parrot::Config;
12 =head1 NAME
14 t/dynpmc/dynlexpad.t - test the DynLexPad PMC
16 =head1 SYNOPSIS
18         % prove t/dynpmc/dynlexpad.t
20 =head1 DESCRIPTION
22 Tests the C<DynLexPad> PMC.
24 =cut
26 pir_output_is( << 'CODE', << 'OUTPUT', "loadlib" );
27 .sub main :main
28     .local pmc lib
29     lib = loadlib "dynlexpad"
30     unless lib goto not_loaded
31     print "ok\n"
32     end
33 not_loaded:
34     print "not loaded\n"
35 .end
36 CODE
38 OUTPUT
40 my $loadlib = <<'EOC';
41 .loadlib "dynlexpad"
43 .HLL "Some"
44 .sub load :anon :init
45   .local pmc interp, lexpad, dynlexpad
46   interp = getinterp
47   lexpad = get_class 'LexPad'
48   dynlexpad = get_class 'DynLexPad'
49   interp.'hll_map'(lexpad, dynlexpad)
50 .end
52 EOC
54 pir_output_is( $loadlib . << 'CODE', << 'OUTPUT', "store_lex" );
55 # see loadlib
56 .sub 'test' :main
57     foo()
58 .end
59 .sub foo :lex
60     $P1 = new 'Integer'
61     $P1 = 13013
62     store_lex 'a', $P1
63     print "ok 1\n"
64     $P2 = find_lex 'a'
65     print "ok 2\n"
66     print $P2
67     print "\n"
68     end
69 .end
70 CODE
71 ok 1
72 ok 2
73 13013
74 OUTPUT
76 pir_output_is( $loadlib . << 'CODE', << 'OUTPUT', "check :outer" );
77 .sub 'test' :main
78     foo()
79 .end
80 .sub foo :lex
81     $P1 = new 'Integer'
82     $P1 = 13013
83     store_lex 'a', $P1
84     $P2 = find_lex 'a'
85     print $P2
86     print "\n"
87     .const 'Sub' bar_sub = "bar"
88     $P0 = newclosure bar_sub
89     $P0()
90 .end
91 .sub bar :outer(foo)
92     .const 'Sub' baz_sub = "baz"
93     $P0 = newclosure baz_sub
94     $P0()
95 .end
96 .sub baz :lex :outer(bar)
97     $P1 = find_lex 'a'
98     print $P1
99     print "\n"
100 .end
101 CODE
102 13013
103 13013
104 OUTPUT
106 pir_output_is( $loadlib . << 'CODE', << 'OUTPUT', "tcl-ish upvar" );
107 .sub 'test' :main
108     foo()
109 .end
110 .sub foo :lex
111     $P1 = new 'Integer'
112     $P1 = 13013
113     store_lex 'a', $P1
114     $P2 = find_lex 'a'
115     print $P2
116     print "\n"
117     .const 'Sub' bar_sub = "bar"
118     $P0 = newclosure bar_sub
119     $P0()
120     # check the upvar
121     $P2 = find_lex 'b'
122     print $P2
123     print "\n"
124 .end
125 .sub bar :outer(foo)
126     .const 'Sub' baz_sub = "baz"
127     $P0 = newclosure baz_sub
128     $P0()
129 .end
130 .sub baz :lex :outer(bar)
131     $P1 = find_lex 'a'
132     print $P1
133     print "\n"
134     # upvar 2 'b', 55
135     .local pmc pad, interp
136     interp = getinterp
137     pad = interp["lexpad"; 2]
138     $P2 = new 'Integer'
139     $P2 = 55
140     pad['b'] = $P2
141     .return()
142 err:
143     print "outer not found\n"
144 .end
145 CODE
146 13013
147 13013
149 OUTPUT
151 pir_output_is( $loadlib . << 'CODE', << 'OUTPUT', "check that dynlexpad honors hll" );
152 .sub 'test' :main
153     foo()
154     bar()
155 .end
156 .sub foo :lex
157     .local pmc pad, interp
158     interp = getinterp
159     pad = interp["lexpad"]
160     $S0 = typeof pad
161     print $S0
162     print "\n"
163 .end
164 .HLL "parrot"
165 .sub bar :lex
166     .local pmc pad, interp
167     interp = getinterp
168     pad = interp["lexpad"]
169     $S0 = typeof pad
170     print $S0
171     print "\n"
172 .end
173 CODE
174 DynLexPad
175 LexPad
176 OUTPUT
178 pir_output_is( $loadlib . << 'CODE', << 'OUTPUT', "dynlexpad - lexpad interop" );
179 .sub 'test' :main
180     foo()
181 .end
183 .sub foo
184     .lex 'a', $P0               # static lexical
185     $P0 = new 'String'
186     $P0 = "ok 1"
187     $P1 = find_lex 'a'
188     say $P1
190     $P2 = new 'String'
191     $P2 = "ok 2"
192     store_lex 'a', $P2
193     say $P0                   # sic!
195     $P3 = new 'String'
196     $P3 = "ok 3"
197     store_lex 'b', $P3          # and a dynamic one
198     $P4 = find_lex 'b'
199     say $P4
200 .end
201 CODE
202 ok 1
203 ok 2
204 ok 3
205 OUTPUT
207 TODO: {
208     local $TODO = "iterator not implemented for DynLexPads";
210 pir_output_is( $loadlib . << 'CODE', << 'OUTPUT', "dynlexpad - iterator" );
211 .sub 'test' :main
212     .local pmc dlp, str1, str2, str3, it, key, interp
214     .lex 'a', str1
215     .lex 'b', str2
216     .lex 'c', str3
218     str1 = new 'String'
219     str1 = 'happy pants'
221     str2 = new 'String'
222     str2 = 'content pants'
224     str3 = new 'String'
225     str3 = 'sad pants'
227     interp = getinterp
228     dlp    = interp['lexpad']
230     say "Getting iterator"
231     it = iter dlp
232     say "Have iterator"
233 iter_loop:
234     unless it goto iter_done
235     key = shift it
236     $S0 = key
237     print key
238     print ":"
239     key = dlp[key]
240     $S0 = key
241     say key
242     goto iter_loop
243 iter_done:
244 .end
245 CODE
246 a:happy pants
247 b:content pants
248 c:sad pants
249 OUTPUT
252 # Local Variables:
253 #   mode: cperl
254 #   cperl-indent-level: 4
255 #   fill-column: 100
256 # End:
257 # vim: expandtab shiftwidth=4: