fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / stringiterator.t
blob667cc097f83db28afc1d1c3e76087e7631e61636
1 #!./parrot
2 # Copyright (C) 2001-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/stringiterator.t - StringIterator.
9 =head1 SYNOPSIS
11     % prove t/pmc/stringiterator.t
13 =head1 DESCRIPTION
15 Tests the C<StringIterator> PMC. Iterate over string in both directions.
17 =cut
19 .include 'iterator.pasm'
20 .include 'except_types.pasm'
22 .sub main :main
23     .include 'test_more.pir'
25     plan(30)
27     test_get_pmc()
28     test_clone()
29     test_elements()
30     iterate_forward() # 11 tests
31     iterate_backward() # 8 tests
32     iterate_wrong() # 1 test
33     iterate_out() # 1 test
34     get_keyed()
36 .end
39 .sub 'test_get_pmc'
40     .local pmc s, it, sget
41     s = new ['String']
42     s = 'foobar'
43     it = iter s
44     sget = deref it
45     is(s, sget, 'deref StringIterator gives the iterated string')
46 .end
48 .sub 'test_clone'
49     .local pmc s, it, itc
50     .local int nit, nitc
52     s = new ['String']
53     s = 'somestring'
54     it = iter s
55     # Get a clone and make sure both the original and the clone
56     # gets marked.
57     sweep 1
58     nit = elements it
59     itc = clone it
60     sweep 1
61     nitc = elements itc
62     is(nit, nitc, "clone has same length as original")
63 .end
65 .sub test_elements
66     .local string s
67     .local pmc ps, it
68     .local int ns, nit
70     s = 'someotherstring'
71     ps = new ['String']
72     ps = s
73     it = iter ps
74     ns = length s
75     nit = elements it
76     is(ns, nit, "iter elements is equal to string length")
77     nit = it
78     is(ns, nit, "iter get_integer is equal to string length")
79 .end
81 .sub 'iterate_forward'
82     .local pmc s, it
84     s = new ['String']
86     it = iter s
87     nok(it, "Iterator for empty string is empty")
88     $I0 = isa it, 'Iterator'
89     ok($I0, "Have proper type")
91     s  = "bar"
92     it = s
94     it = iter s
95     ok(it, "Iterator for 'bar' is not empty")
96     $S0 = shift it
97     ok(it, "Can shift 1st character")
98     is($S0, 'b', "With correct value")
100     $S0 = it[0]
101     is($S0, 'a', "can get string keyed int correct value")
103     $S0 = shift it
104     ok(it, "Can shift 2nd character")
105     is($S0, 'a', "With correct value")
107     $P0 = shift it
108     nok(it, "Iterator is finished after 3rd shift")
109     is($P0, 'r', "3rd character has correct value as PMC")
111     $I0 = 1
112     push_eh fail
113     $P0 = shift it
114     $I0 = 0
115   fail:
116     pop_eh:
117     ok($I0, "Shifting from finished iterator throws exception")
119 .end
121 .sub 'iterate_backward'
122     .local pmc s, it
124     s = new ['String']
125     s = 'BAZ'
127     it = iter s
128     it = .ITERATE_FROM_END
129     ok(it, "Iterator reset to backward iteration")
131     $S0 = pop it
132     ok(it, "Can shift 1st character")
133     is($S0, 'Z', "With expected value")
135     $S0 = pop it
136     ok(it, "Can shift 2nd character")
137     is($S0, 'A', "With expected value")
139     $P0 = pop it
140     nok(it, "Iterator is finished after third shift")
141     is($P0, 'B', "3rd element has correct value as PMC")
143     $I0 = 1
144     push_eh fail
145     $P0 = pop it
146     $I0 = 0
147   fail:
148     pop_eh
149     ok($I0, "Shifting from finished iterator throws exception")
150 .end
152 .sub 'iterate_wrong'
153     .local pmc s, it, ex
154     .local int r
156     s = new ['String']
157     s = 'BAZ'
159     it = iter s
160     push_eh catch_wrong
161     it = 42 # Let's hope we'll never have such direction
162     r = 0
163     goto dotest
164 catch_wrong:
165     .get_results(ex)
166     finalize ex
167     pop_eh
168     r = 1
169 dotest:
170     ok(r, "Caught wrong direction")
171 .end
173 # out of bounds conditions not covered by previous tests
174 .sub 'iterate_out'
175     .local pmc s, it, eh
176     s = new ['String']
177     s = 'hi'
178     it = iter s
179     .local string rs
180     rs = shift it
181     rs = shift it
182     eh = new ['ExceptionHandler']
183     push_eh eh
185     # shift string
186     set_addr eh, catch1
187     rs = shift it
188     goto fail
189 catch1:
190     finalize eh
192     # shift integer
193     set_addr eh, catch2
194     .local int ri
195     ri = shift it
196     goto fail
197 catch2:
198     finalize eh
201     # pop string
202     set_addr eh, catch3
203     .local int ri
204     rs = pop it
205     goto fail
206 catch3:
207     finalize eh
209     # pop integer
210     set_addr eh, catch4
211     .local int ri
212     ri = pop it
213     goto fail
214 catch4:
215     finalize eh
217     ok(1, "Caught out of bounds iterations")
218     goto end
219 fail:
220     ok(0, "Out of bounds iteration should throw")
221 end:
222 .end
224 .sub get_keyed
225     .local pmc s, it, eh
226     .local string s1
227     .local int result, i1
228     result = 0
229     s = new ['String']
230     s = 'hi'
231     it = iter s
232     s1 = it[0]
233     is(s1, 'h', 'get_string_keyed_int - zero')
234     s1 = it[1]
235     is(s1, 'i', 'get_string_keyed_int - not zero')
237     eh = new ['ExceptionHandler']
238     eh.'handle_types'(.EXCEPTION_OUT_OF_BOUNDS)
239     set_label eh, catch
240     push_eh eh
241     s1 = it[2]
242     goto done
243   catch:
244     finalize eh
245     result = 1
246   done:
247     ok(result, 'get_string_keyed_int out of bounds')
249     result = 0
250     i1 = it[0]
251     s1 = chr i1
252     is(s1, 'h', 'get_integer_keyed_int')
254     set_label eh, catch2
255     i1 = it[2]
256     goto done2
257   catch2:
258     finalize eh
259     result = 1
260   done2:
261     ok(result, 'get_integer_keyed_int out of bounds')
262 .end
264 # Local Variables:
265 #   mode: pir
266 #   fill-column: 100
267 # End:
268 # vim: expandtab shiftwidth=4 ft=pir: