fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / exception.t
blob7b8eb3fbe79089b1393f5d6c43dd17eddbc3c438
1 #!./parrot
2 # Copyright (C) 2009-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/exception.t - Exception Handling
9 =head1 SYNOPSIS
11     % prove t/pmc/exception.t
13 =head1 DESCRIPTION
15 Tests C<Exception> and C<ExceptionHandler> PMCs.
17 =cut
19 .include 'except_types.pasm'
21 .sub main :main
22     .include 'test_more.pir'
23     plan(43)
24     test_bool()
25     test_int()
26     test_integer_keyed()
27     test_string_keyed()
28     test_attrs()
29     test_attributes()
30     test_setattribute_wrong()
31     test_birthtime()
32     test_handler_ctx()
33     test_push_pop_eh()
34     test_push_pop_eh_long()
35     test_push_eh_throw()
36     test_die()
37     test_throw_obj()
38     test_clone()
39     test_throw_clone()
40     test_backtrace()
41     test_annotations()
42 .end
44 .sub test_bool
45     $P1 = new 'Exception'
46     ok($P1,'Exception object return true')
47 .end
49 .sub test_int
50     $P0 = new 'Exception'
51     $P0 = 42
52     $I0 = $P0
53     is($I0, 42, 'set/get integer on Exception')
54 .end
56 .sub test_integer_keyed
57     .local pmc ex, eh
58     .local int value
59     ex = new ['Exception']
61     value = ex['type']
62     is(value, 0, 'get type default value')
63     ex['type'] = .EXCEPTION_SYNTAX_ERROR
64     value = ex['type']
65     is(value, .EXCEPTION_SYNTAX_ERROR, 'get type value changed')
67     value = ex['exit_code']
68     is(value, 0, 'get exit_code default value')
69     ex['exit_code'] = 127
70     value = ex['exit_code']
71     is(value, 127, 'get exit_code value changed')
73     value = ex['handled']
74     is(value, 0, 'get handled default is false')
75     ex['handled'] = 1
76     value = ex['handled']
77     is(value, 1, 'get handled value changed')
79     eh = new ['ExceptionHandler']
80     eh.'handle_types'(.EXCEPTION_ATTRIB_NOT_FOUND)
81     set_label eh, catch
82     push_eh eh
83     value = 1
84     ex['the droids you are looking for'] = 42
85     value = 0
86   catch:
87     finalize eh
88     is(value, 1, 'set invalid key throws')
90     set_label eh, catch2
91     value = 1
92     value = ex['the droids you are looking for']
93     value = 0
94   catch2:
95     finalize eh
96     is(value, 1, 'get invalid key throws')
97 .end
99 .sub test_string_keyed
100     .local pmc ex, eh
101     .local string value
102     .const string TEST_VALUE = 'fubar'
103     ex = new ['Exception']
104     ex['message'] = TEST_VALUE
105     value = ex['message']
106     is(value, TEST_VALUE, 'set/get string_keyed')
107 .end
110 .sub setattr_int
111     .param pmc obj
112     .param string attrname
113     .param int value
114     $P0 = new ['Integer'], value
115     setattribute obj, attrname, $P0
116 .end
118 .sub setattr_string
119     .param pmc obj
120     .param string attrname
121     .param string value
122     $P0 = new ['String']
123     $P0 = value
124     setattribute obj, attrname, $P0
125 .end
127 .sub gotattr_int
128     .param pmc obj
129     .param string attrname
130     .param int checkvalue
132     $S0 = 'got ' . attrname
133     $P1 = getattribute obj, attrname
134     $I1 = $P1
135     is($I1, checkvalue, $S0)
136 .end
138 .sub gotattr_string
139     .param pmc obj
140     .param string attrname
141     .param string checkvalue
143     $S0 = 'got ' . attrname
144     $P1 = getattribute obj, attrname
145     $S1 = $P1
146     is($S1, checkvalue, $S0)
147 .end
150 .sub test_attrs
151     $P0 = new 'ExceptionHandler'
152     set_addr $P0, _handler
153     push_eh $P0
154     throw $P0
155   _handler:
156     get_results "0", $P0
157     getattribute $P1, $P0, 'type'
158     ok(1,'got type')
159     getattribute $P2, $P0, 'handled'
160     is($P2,0,'got handled')
161     getattribute $P3, $P0, 'exit_code'
162     is($P2,0,'got exit_code')
163     getattribute $P4, $P0, 'severity'
164     ok(1,'got severity')
166     push_eh catch
167     $I0 = 1
168     getattribute $P5, $P0, 'foo'
169     $I0 = 0
170     goto done
171   catch:
172     .get_results($P0)
173     finalize $P0
174   done:
175     ok($I0, "Can't fetch non-existent attribute")
176 .end
178 .sub test_attributes
179     $P1 = new ['Exception']
181     setattr_int($P1,    'type',      5)
182     setattr_int($P1,    'severity',  6)
183     setattr_int($P1,    'exit_code', 7)
184     setattr_int($P1,    'handled',   1)
185     setattr_string($P1, 'message',   "just pining")
186     setattr_string($P1, 'payload',   "additional payload")
188     $P8 = new ['ResizablePMCArray']
189     $P8 = 2
190     $P8[0] = 'backtrace line 1'
191     $P8[1] = 'backtrace line 2'
192     setattribute $P1, 'backtrace', $P8
194     push_eh handler
195     throw $P1
196     ok(0, "throwing exception failed")
197     skip(7, "because of throwing exception failed")
198     .return()
199   handler:
200     .get_results($P0)
201     pop_eh
203     gotattr_int($P0,    'type',      5)
204     gotattr_int($P0,    'severity',  6)
205     gotattr_int($P0,    'exit_code', 7)
206     gotattr_int($P0,    'handled',   1)
207     gotattr_string($P0, 'message',   "just pining")
208     gotattr_string($P0, 'payload',   "additional payload")
210     $P28 = getattribute $P0, 'backtrace'
211     $P30 = $P28[0]
212     is($P30, "backtrace line 1", 'got backtrace data')
214     $P31 = $P28[1]
215     is($P31, "backtrace line 2", 'more backtrace data')
216 .end
218 .sub test_setattribute_wrong
219     .local pmc ex, eh
220     .local int result
221     ex = new ['Exception']
222     eh = new ['ExceptionHandler']
223     eh.'handle_types'(.EXCEPTION_ATTRIB_NOT_FOUND)
224     set_addr eh, catch
225     result = 0
226     push_eh eh
227     setattribute ex, 'wrong attribute', eh
228     goto done
229   catch:
230     result = 1
231     finalize eh
232   done:
233     is(result, 1, 'setting a wrong attribute throws')
234 .end
236 .sub test_birthtime
237     .local pmc ex, bt
238     ex = new ['Exception']
239     .local num n, nbt
240     n = 123.456
241     ex = n
242     bt = getattribute ex, 'birthtime'
243     nbt = bt
244     is(nbt, n, 'get and set birthtime')
245 .end
247 .sub test_handler_ctx
248     .local pmc ex, eh, hc
249     .local int result
250     ex = new ['Exception']
251     eh = new ['ExceptionHandler']
252     eh.'handle_types'(.EXCEPTION_INVALID_OPERATION)
254     result = 0
255     set_label eh, catch_get
256     push_eh eh
257     hc = getattribute ex, 'handler_ctx'
258     goto done_get
259   catch_get:
260     finalize eh
261     result = 1
262   done_get:
263     is(result, 1, 'get handler_ctx invalid operation')
265     result = 0
266     set_label eh, catch_set
267     setattribute ex, 'handler_ctx', ex
268     goto done_set
269   catch_set:
270     finalize eh
271     result = 1
272   done_set:
273     is(result, 1, 'set handler_ctx invalid operation')
274 .end
276 .sub test_push_pop_eh
277     push_eh handler
278     ok(1,'push_eh works')
280     pop_eh
281     ok(1,'pop_eh works')
282     .return()
284   handler:
285     say "i am the decider"
286 .end
288 .sub test_push_eh_throw
289     push_eh handler
290     $P0 = new ['Exception']
291     throw $P0
292     ok(0,'throw does not throw')
294   handler:
295     ok(1,'throw can throw')
296 .end
298 .sub test_push_pop_eh_long
299     $P0 = new ['ExceptionHandler']
300     set_addr $P0, handler
301     push_eh $P0
302     ok(1,'push_eh works (long)')
304     pop_eh
305     ok(1,'pop_eh works (long)')
306     .return()
308   handler:
309     say "i am the decider"
310 .end
312 .sub test_die
313     push_eh handler
314     die 3, 100
315     say "not reached"
316     .return()
317   handler:
318     ok(1,'die works')
319 .end
321 .sub test_throw_obj
322     new $P20, ['ExceptionHandler']
323     set_addr $P20, _handler
324     push_eh $P20
325     new $P30, ['Exception']
326     throw $P30
327     say "not reached"
328 _handler:
329     ok(1,'caught exception object thrown')
330 .end
332 # Test clone vtable function
334 .sub test_clone
335     .local pmc ex, exclone
336     ex = new ['Exception']
337     ex['type'] = .EXCEPTION_SYNTAX_ERROR
338     exclone = clone ex
339     .local int result
340     result = iseq ex, exclone
341     is(result, 1, 'cloned Exception is equal to original')
342     exclone['type'] = .EXCEPTION_ERR_OVERFLOW
343     result = iseq ex, exclone
344     is(result, 0, 'cloned and modified Exception is not equal to original')
345 .end
347 .sub test_throw_clone
348     .local pmc ex, exclone, eh, ehguard
349     .local int result
350     ex = new ['Exception']
351     ex['type'] = .EXCEPTION_SYNTAX_ERROR
352     exclone = clone ex
354     ehguard = new ['ExceptionHandler']
355     set_label ehguard, catchall
356     push_eh ehguard
357     eh = new ['ExceptionHandler']
358     eh.'handle_types'(.EXCEPTION_SYNTAX_ERROR)
359     set_label eh, catch
360     result = 0
361     push_eh eh
362     throw exclone
363     goto catchall
364   catch:
365     result = 1
366   catchall:
367     finalize eh
368     finalize ehguard
369     is(result, 1, 'caught a cloned Exception')
371     null exclone
372     result = 0
373     .local pmc pay, getpay, exc
374     set_label ehguard, catchall2
375     set_label eh, catch2
377     pay = new ['Integer'], 9875
378     ex['payload'] = pay
379     exclone = clone ex
380     result = iseq ex, exclone
381     is(result, 1, 'cloned Exception with payload is equal to original')
383     result = 0
384     throw exclone
385     goto catchall2
386   catch2:
387     .get_results(exc)
388     getpay = exc['payload']
389     $I0 = getpay
390     if $I0 != 9875 goto catchall2
391     result = 1
392   catchall2:
393     is(result, 1, 'caught a cloned Exception with payload')
394 .end
396 .sub test_backtrace
397     .local pmc ex, bt
398     ex = new ['Exception']
399     bt = ex.'backtrace'()
400     $I0 = isnull bt
401     is($I0, 0, 'got backtrace from unthrow Exception')
402 .end
404 .sub test_annotations
405     .local pmc ex, ann
406     ex = new ['Exception']
407     ann = ex.'annotations'()
408     $I0 = isnull ann
409     is($I0, 0, 'got annotations from unthrow Exception')
410     $I0 = ann
411     is($I0, 0, 'annotations from unthrow Exception are empty')
412 .end
414 # Local Variables:
415 #   mode: pir
416 #   fill-column: 100
417 # End:
418 # vim: expandtab shiftwidth=4 ft=pir: