Skip to content

Commit 4111c28

Browse files
committed
Test throwing and handling control exceptions.
1 parent 6937b9e commit 4111c28

File tree

1 file changed

+66
-1
lines changed

1 file changed

+66
-1
lines changed

t/nqp/044-try-catch.t

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# Tests for try and catch
44

5-
plan(32);
5+
plan(43);
66

77
sub oops($msg = "oops!") { # throw an exception
88
nqp::die($msg);
@@ -241,3 +241,68 @@ ok($result_str ~ '' eq '', "we get correct return value from a try that catches
241241
}
242242
nqp::handle(block(), 'CATCH', catch());
243243
}
244+
245+
sub THROW(int $type, $arg) {
246+
my $ex := nqp::newexception();
247+
nqp::setpayload($ex, $arg);
248+
nqp::setextype($ex, $type);
249+
nqp::throw($ex);
250+
$arg;
251+
}
252+
253+
my $next_payload;
254+
my $redo_payload;
255+
my $last_payload;
256+
my $return_payload;
257+
my $take_payload;
258+
my $warn_payload;
259+
my $succeed_payload;
260+
my $proceed_payload;
261+
my $emit_payload;
262+
my $done_payload;
263+
264+
sub handle($throws) {
265+
nqp::handle(
266+
$throws(),
267+
'NEXT', $next_payload := nqp::getpayload(nqp::exception()),
268+
'REDO', $redo_payload := nqp::getpayload(nqp::exception()),
269+
'LAST', $last_payload := nqp::getpayload(nqp::exception()),
270+
'RETURN', $return_payload := nqp::getpayload(nqp::exception()),
271+
'TAKE', $take_payload := nqp::getpayload(nqp::exception()),
272+
'WARN', $warn_payload := nqp::getpayload(nqp::exception()),
273+
'SUCCEED', $succeed_payload := nqp::getpayload(nqp::exception()),
274+
'PROCEED', $proceed_payload := nqp::getpayload(nqp::exception()),
275+
'EMIT', $emit_payload := nqp::getpayload(nqp::exception()),
276+
'DONE', $done_payload := nqp::getpayload(nqp::exception()),
277+
);
278+
}
279+
280+
handle(-> { THROW(nqp::const::CONTROL_NEXT, 'next'); });
281+
handle(-> { THROW(nqp::const::CONTROL_REDO, 'redo'); });
282+
handle(-> { THROW(nqp::const::CONTROL_LAST, 'last'); });
283+
handle(-> { THROW(nqp::const::CONTROL_RETURN, 'return'); });
284+
handle(-> { THROW(nqp::const::CONTROL_TAKE, 'take'); });
285+
handle(-> { THROW(nqp::const::CONTROL_WARN, 'warn'); });
286+
handle(-> { THROW(nqp::const::CONTROL_SUCCEED, 'succeed'); });
287+
handle(-> { THROW(nqp::const::CONTROL_PROCEED, 'proceed'); });
288+
handle(-> { THROW(nqp::const::CONTROL_EMIT, 'emit'); });
289+
handle(-> { THROW(nqp::const::CONTROL_DONE, 'done'); });
290+
291+
is($next_payload, 'next', 'caught NEXT exception');
292+
is($redo_payload, 'redo', 'caught REDO exception');
293+
is($last_payload, 'last', 'caught LAST exception');
294+
is($return_payload, 'return', 'caught RETURN exception');
295+
is($take_payload, 'take', 'caught TAKE exception');
296+
is($warn_payload, 'warn', 'caught WARN exception');
297+
is($succeed_payload, 'succeed', 'caught SUCCEED exception');
298+
is($proceed_payload, 'proceed', 'caught PROCEED exception');
299+
is($emit_payload, 'emit', 'caught EMIT exception');
300+
is($done_payload, 'done', 'caught DONE exception');
301+
302+
my $control_payload;
303+
{
304+
THROW(nqp::const::CONTROL_NEXT, 'fancy payload');
305+
CONTROL { $control_payload := $!; }
306+
}
307+
308+
is(nqp::getpayload($control_payload), 'fancy payload', 'CONTROL block works');

0 commit comments

Comments
 (0)