fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / t / pmc / exceptionhandler.t
blob598e267a0a03ddf79850f4efb5be19d0bc563540
1 #!./parrot
2 # Copyright (C) 2006-2010, Parrot Foundation.
3 # $Id$
5 =head1 NAME
7 t/pmc/exception_handler.t - test ExceptionHandler PMC
9 =head1 SYNOPSIS
11     % prove t/pmc/exceptionhandler.t
13 =head1 DESCRIPTION
15 Tests the ExceptionHandler PMC.
17 =cut
19 .include 'except_severity.pasm'
20 .include 'except_types.pasm'
22 .sub main :main
23     .include 'test_more.pir'
25     # If test exited with "bad plan" MyHandlerCan.can_handle wasn't invoked.
26     plan(18)
28     test_bool()
29     test_int()
31     .local pmc eh, eh2
32     eh = new ['ExceptionHandler']
33     ok(1, 'Instantiated ExceptionHandler')
35     set_addr eh, nonfatal_handler_one
36     eh.'min_severity'(.EXCEPT_NORMAL)
37     eh.'max_severity'(.EXCEPT_WARNING)
38     push_eh eh
40     eh2 = new ['ExceptionHandler']
41     set_addr eh2, error_handler_one
42     eh2.'min_severity'(.EXCEPT_ERROR)
43     eh2.'max_severity'(.EXCEPT_FATAL)
44     push_eh eh2
46     .local int i
47     i = eh.'min_severity'()
48     is(i, .EXCEPT_NORMAL, 'get min_severity - 1')
49     i = eh.'max_severity'()
50     is(i, .EXCEPT_WARNING, 'get max_severity - 1')
51     i = eh2.'min_severity'()
52     is(i, .EXCEPT_ERROR, 'get min_severity - 2')
53     i = eh2.'max_severity'()
54     is(i, .EXCEPT_FATAL, 'get max_severity - 2')
56     $P0 = new ['Exception']
57     $P0['severity'] = .EXCEPT_NORMAL
58     throw $P0
60     $P0 = new ['Exception']
61     $P0['severity'] = .EXCEPT_SEVERE
62     throw $P0
64     pop_eh
65     pop_eh
67     goto more_tests
69   nonfatal_handler_one:
70     .local pmc e, c
71     .get_results (e)
72     ok(1, 'Min and Max severity for exception handlers')
73     c = e['resume']
74     eh = 0
75     c()
76   error_handler_one:
77     .get_results (e)
78     ok(1, 'Min and Max severity for exception handlers')
79     c = e['resume']
80     eh = 0
81     c()
83   more_tests:
85     eh = new ['ExceptionHandler']
86     set_addr eh, typed_handler_one
87     eh.'handle_types'(.CONTROL_OK, .CONTROL_BREAK)
88     push_eh eh
90     eh = new ['ExceptionHandler']
91     set_addr eh, typed_handler_two
92     eh.'handle_types'(.EXCEPTION_SYNTAX_ERROR, .EXCEPTION_UNEXPECTED_NULL)
93     push_eh eh
95     $P0 = new ['Exception']
96     $P0['type'] = .CONTROL_OK
97     throw $P0
99     $P0 = new ['Exception']
100     $P0['type'] = .CONTROL_BREAK
101     throw $P0
103     pop_eh
104     pop_eh
106     test_handle_types_except()
108     goto subclass_handler
110   typed_handler_one:
111     .get_results (e)
112     ok(1, 'Exception Handler type checks work')
113     c = e['resume']
114     eh = 0
115     c()
116   typed_handler_two:
117     .get_results (e)
118     ok(0, 'Exception Handler type checks work')
119     c = e['resume']
120     eh = 0
121     c()
123   subclass_handler:
124     .local pmc myhandler, myhandlercan
125     myhandler = subclass_exception_handler()
126     myhandlercan = subclass_exception_handler_can()
127     $I0 = subclass_handler_pop(myhandler)
128     ok($I0, 'Exception Handler subclass popped')
129     $I0 = subclass_handler_catches_can(myhandlercan)
130     ok($I0, 'Exception Handler subclass with can_handle method catch exception')
132     # This test is not expected to die now.
133     # Please report to TT #154 if it must be skipped again.
134     #skip(1,'Exception Handler subclass causes segfault: TT #154')
135     $I0 = 0
136     push_eh outcatch
137     $I0 = subclass_handler_catches(myhandler)
138   outcatch:
139     ok($I0, 'Exception Handler subclass catch exception')
140 .end
142 .sub test_bool
143     $P0 = new 'ExceptionHandler'
144     nok($P0,'ExceptionHandler without address is false')
145     set_addr $P0, _handler
146     ok($P0,'ExceptionHandler with address is true')
147   _handler:
148 .end
150 .sub test_int
151     $P0 = new 'ExceptionHandler'
152     set_addr $P0, _handler
153     push_eh $P0
154     $I0 = $P0
155     ok(1,'get_integer on ExceptionHandler ')
156     .return()
157   _handler:
158     say "howdy int!"
159 .end
162 .sub subclass_exception_handler
163     .local pmc myhandler
164     myhandler = subclass 'ExceptionHandler', [ 'MyHandler' ]
165     .return(myhandler)
166 .end
168 .sub subclass_exception_handler_can
169     .local pmc myhandler
170     myhandler = subclass 'ExceptionHandler', [ 'MyHandlerCan' ]
171     .return(myhandler)
172 .end
174 .sub subclass_handler_pop
175     .param pmc myhandler
176     .local pmc eh
177     eh = new ['ExceptionHandler']
178     set_addr eh, subclassed_popped
179     push_eh eh
181     .local pmc myeh
182     new myeh, myhandler
183     set_addr myeh, subclassed_handler
184     push_eh myeh
186     pop_eh
188     $P0 = new ['Exception']
189     throw $P0
191   subclassed_popped:
192     .return(1)
194   subclassed_handler:
195     .return(0)
196 .end
198 .sub subclass_handler_catches_can
199     .param pmc myhandler
200     .local pmc eh
201     eh = new ['ExceptionHandler']
202     set_addr eh, subclassed_failed
203     push_eh eh
205     .local pmc myeh
206     new myeh, myhandler
207     set_addr myeh, subclassed_handler
208     push_eh myeh
210     $P0 = new ['Exception']
211     throw $P0
213   subclassed_failed:
214     .get_results($P0)
215     .return(0)
217   subclassed_handler:
218     .get_results($P0)
219     .return(1)
220 .end
222 .sub subclass_handler_catches
223     .param pmc myhandler
224     .local pmc eh
225     eh = new ['ExceptionHandler']
226     set_addr eh, subclassed_failed
227     push_eh eh
229     .local pmc myeh
230     new myeh, myhandler
231     set_addr myeh, subclassed_handler
232     push_eh myeh
234     $P0 = new ['Exception']
235     throw $P0
237   subclassed_failed:
238     .get_results($P0)
239     .return(0)
241   subclassed_handler:
242     .get_results($P0)
243     .return(1)
244 .end
246 .namespace [ 'MyHandler' ]
248 .namespace [ 'MyHandlerCan' ]
250 .sub can_handle :method
251     .param pmc ex
252     ok(1, 'MyHandlerCan.can_handle invoked')
253     .return(1)
254 .end
256 .namespace [ ]
258 .sub 'test_handle_types_except'
259     .local pmc badeh, eh, ex
260     .local int i
261     .const int TYPEUSED = .EXCEPTION_UNEXPECTED_NULL
262     .const int TYPEOTHER = .EXCEPTION_SYNTAX_ERROR
264     i = 0
265     eh = new ['ExceptionHandler']
266     badeh = new ['ExceptionHandler']
267     eh.'handle_types_except'(TYPEUSED)
268     set_addr eh, catch
269     set_addr badeh, badcatch
270     push_eh badeh
271     push_eh eh
272     ex = new ['Exception']
273     ex['type'] = TYPEOTHER
274     throw ex
275     goto report1
276   badcatch:
277     finalize eh
278     goto report1
279   catch:
280     finalize eh
281     i = 1
282   report1:
283     ok(i, 'type not in except is list is caught')
285     i = 0
286     set_addr badeh, catchall
287     set_addr eh, dontcatch
288     ex = new ['Exception']
289     ex['type'] = TYPEUSED
290     throw ex
291     goto report2
292   catchall:
293     finalize eh
294     i = 1
295     goto report2
296   dontcatch:
297     finalize eh
298   report2:
299     pop_eh
300     pop_eh
301     ok(i, 'type in except is list is not caught')
302 .end
304 # Local Variables:
305 #   mode: pir
306 #   fill-column: 100
307 # End:
308 # vim: expandtab shiftwidth=4 ft=pir: