#!env perl -w # # more tests for exception handling. # use strict; use warnings; use Test::More tests => 33; BEGIN { use_ok 'Glib'; } package MyClass; use Glib::Object::Subclass Glib::Object::, signals => { first => {}, second => {}, }, ; sub first { $_[0]->signal_emit ('first'); } sub second { $_[0]->signal_emit ('second'); } ############ package main; # keep stderr quiet, redirect it to stdout... $SIG{__WARN__} = sub { print $_[0]; }; my $tag = Glib->install_exception_handler (sub { $_[0] =~ s/\n/\\n/g; ok (1, "trapped exception '$_[0]'"); # this should be ignored, too, and should NOT create an # infinite loop. die "oh crap, another exception!\nthis one has multiple lines!\nappend something"; 1 }); ok( $tag, 'installed exception handler' ); ok( Glib->install_exception_handler (sub { if ($_[0] =~ /ouch/) { ok (1, 'saw ouch, uninstalling'); return 0; } else { ok (0, 'additional handler still installed'); return 1; } }), 'installed an additional handler' ); { my $my = new MyClass; $my->signal_connect (first => sub { ok (1, 'in first handler, calling second'); $_[0]->second; ok (1, "handler may die, but we shouldn't"); }); $my->signal_connect (second => sub { ok (!$@, "signal handlers are eval'd so \$@ should always be empty"); ok (1, "in second handler, dying with 'ouch\\n'"); die "ouch\n"; ok (0, "should NEVER get here"); }); $_ = $my; ok (1, 'calling second'); $my->second; ok (1, "handler may die, but we shouldn't be affected"); is ($_, $my, 'we should not clobber $_'); $_ = undef; # expect identical behavior in eval context eval { ok (1, 'calling second in eval'); $my->second; ok (1, "handler may die, but we shouldn't be affected"); }; is ($@, "", "exception should be cleared already"); # super double gonzo... ok (1, "calling first"); $my->first; ok (1, "after eval"); print " # calling first out of eval - should not result in crash\n"; $my->first; # more exception trapping behavior tests $@ = undef; $my->second; is ($@, undef, 'exception value should remain unchanged'); $@ = 'neener'; $my->first; is ($@, 'neener', 'exception value should remain unchanged'); } __END__ Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the full list) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.