fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / arrayiterator.t
blob3bd484505a7f3415ef8afa68b3fcd4ebc07f0d5d
1 #!./parrot
2 # Copyright (C) 2001-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/arrayiterator.t - ArrayIterator PMC
9 =head1 SYNOPSIS
11     % prove t/pmc/arrayiterator.t
13 =head1 DESCRIPTION
15 Tests C<ArrayIterator> PMC. Navigate in both directions, check bounds.
17 =cut
19 .namespace []
21 .include 'iterator.pasm'
22 .include 'except_types.pasm'
24 .sub main :main
25     .include 'test_more.pir'
27     plan(28)
29     iterate_forward() # 8 tests
30     iterate_backward() # 6 tests
31     iterate_backward_string() # 6 test
32     iterate_wrong() # 1 test
33     iterator_init() # 1 test
34 .end
37 .sub 'iterate_forward'
38     .local pmc foo, it
40     foo = new ['ResizablePMCArray']
42     it = iter foo
43     nok(it, "Iterator for empty array is empty")
44     $I0 = isa it, 'Iterator'
45     ok($I0, "Have proper type")
47     push foo, 1
48     push foo, 42
50     it = iter foo
51     ok(it, "Iterator for 2-elem list is not empty")
52     $P0 = shift it
53     ok(it, "Can shift 1st element")
54     is($P0, 1, "With expected value")
56     $P1 = new ['Integer'], 0
57     $I0 = exists it[$P1]
58     is($I0, 1, "exists_keyed gives expected value")
60     $I0 = defined it[$P1]
61     is($I0, 1, "defined_keyed gives expected value")
63     $P2 = it[$P1]
64     is($P2, 42, "get_pmc_keyed gives expected value")
66     $I0 = it[$P1]
67     is($I0, 42, "get_integer_keyed gives expected value")
69     $N0 = it[$P1]
70     is($N0, 42.0, "get_number_keyed gives expected value")
72     $S0 = it[$P1]
73     is($S0, '42', "get_string_keyed gives expected value")
75     $P0 = shift it
76     nok(it, "Iterator is finished after second shift")
77     is($P0, 42, "2nd element has correct value")
79     .local int result
80     .local pmc ehandler
81     result = 0
82     ehandler = new ['ExceptionHandler']
83     ehandler.'handle_types'(.EXCEPTION_OUT_OF_BOUNDS)
84     push_eh ehandler
86     set_addr ehandler, handlep
87     $P0 = shift it
88     goto fail
89 handlep:
90     finalize ehandler
91     set_addr ehandler, handlei
92     $I0 = shift it
93     goto fail
94 handlei:
95     finalize ehandler
96     set_addr ehandler, handlen
97     $N0 = shift it
98     goto fail
99 handlen:
100     finalize ehandler
101     set_addr ehandler, handles
102     $S0 = shift it
103     goto fail
104 handles:
105     finalize ehandler
107     result = 1
108   fail:
109     pop_eh
110     ok(result, "Shifting from finished iterator throws out of bounds exception")
112 .end
114 .sub 'iterate_backward'
115     .local pmc foo, it
117     foo = new ['ResizablePMCArray']
118     push foo, 1
119     push foo, 42
121     it = iter foo
122     it = .ITERATE_FROM_END
123     ok(it, "Iterator reset to backward iteration")
124     $P0 = pop it
125     ok(it, "Can shift 1st element")
126     is($P0, 42, "With expected value")
127     $P0 = pop it
128     nok(it, "Iterator is finished after second shift")
129     is($P0, 1, "2nd element has correct value")
131     .local int result
132     .local pmc ehandler
133     result = 0
134     ehandler = new ['ExceptionHandler']
135     ehandler.'handle_types'(.EXCEPTION_OUT_OF_BOUNDS)
136     push_eh ehandler
138     set_addr ehandler, handlep
139     $P0 = pop it
140     goto fail
141 handlep:
142     finalize ehandler
143     set_addr ehandler, handlei
144     $I0 = pop it
145     goto fail
146 handlei:
147     finalize ehandler
148     set_addr ehandler, handlen
149     $N0 = pop it
150     goto fail
151 handlen:
152     finalize ehandler
153     set_addr ehandler, handles
154     $S0 = pop it
155     goto fail
156 handles:
157     finalize ehandler
159     result = 1
160   fail:
161     pop_eh
162     ok(result, "pop from finished iterator throws out of bounds exception")
164 .end
166 .sub 'iterate_backward_string'
167     .local pmc foo, it
169     foo = new ['ResizableStringArray']
170     push foo, 'First'
171     push foo, 'Other'
173     it = iter foo
174     it = .ITERATE_FROM_END
175     ok(it, "Iterator reset to backward iteration - string")
176     $S0 = pop it
177     ok(it, "Can shift 1st element - string")
178     is($S0, 'Other', "With expected value- string")
179     $S0 = pop it
180     nok(it, "Iterator is finished after second shift - string")
181     is($S0, 'First', "2nd element has correct value - string")
183     $I0 = 1
184     push_eh fail
185     $S0 = shift it
186     $I0 = 0
187   fail:
188     pop_eh
189     ok($I0, "Shifting from finished iterator throws exception - string")
190 .end
192 .sub 'iterate_wrong'
193     .local pmc foo, it, ex
194     .local int r
196     foo = new ['FixedIntegerArray'], 1
198     it = iter foo
199     push_eh catch_wrong
200     it = 42 # Let's hope we'll never have such direction
201     r = 0
202     goto dotest
203 catch_wrong:
204     .get_results(ex)
205     finalize ex
206     r = 1
207 dotest:
208     pop_eh
209     ok(r, "Caught wrong direction")
210 .end
212 .sub 'iterator_init'
213     .local pmc it, e
214     .local string msg
215     msg = "ArrayIterator can't be directly instantiated, init must throw"
216     push_eh CATCH
217     it = new 'ArrayIterator'
218     pop_eh
219     ok(0, msg)
220     goto DONE
221 CATCH:
222     .get_results(e)
223     pop_eh
224     ok(1, msg)
225 DONE:
226 .end
228 # Local Variables:
229 #   mode: pir
230 #   fill-column: 100
231 # End:
232 # vim: expandtab shiftwidth=4 ft=pir: