The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;
use Wx;
use lib './t';
use Tests_Helper qw(test_app);
use Test::More Wx::wxMAC() ? ( 'skip_all' => 'Hangs on wxMac' ) :
                             ( 'tests'    => 6 );

use Wx::Event qw(EVT_TIMER);

my $app = test_app(
    sub {
        Wx::Frame->new( undef, -1, 'X' )->Show( 1 ); # to appease wxGTK
    } );

my $timer = Wx::Timer->new($app, 123);

sub onTimer0 {
    ok( 1, 'Timer fired' );
    eval 'BEGIN { die "Fatal!" }';
    ok( $@, 'Error was generated and trapped' );

    EVT_TIMER( $app, 123, undef ); # disconnect
    EVT_TIMER( $app, 123, \&onTimer1 );
    $timer->Start( 20, 1 );
}

sub onTimer1 {
    ok( 1, 'Second timer fired' );
    eval 'use ThisModuleDoesNotExist';
    ok( $@, 'Error was generated and trapped' );

    EVT_TIMER( $app, 123, undef ); # disconnect
    EVT_TIMER( $app, 123, \&onTimer2 );
    $timer->Start( 20, 1 );
}

sub onTimer2 {
    ok( 1, 'Third timer fired' );
    die "I am going away...";
    fail( 'panic: die() did not work' );
}

EVT_TIMER( $app, 123, \&onTimer0 );
$timer->Start( 10, 1 );

eval { $app->MainLoop };

like( $@, qr/^I am going away\.\.\./, 'Exception correctly propagated' );