1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
#!/usr/bin/perl -w
# -*- perl -*-
#
# $Id: $
# Author: Slaven Rezic
#
use strict;
use Tk;
BEGIN {
if (!eval q{
use Test::More;
1;
}) {
print "1..0 # skip: no Test::More module\n";
exit;
}
}
plan tests => 5;
use_ok 'Tk::ErrorDialog';
my $mw = tkinit;
$mw->geometry("+10+10");
my $ed;
my $errmsg = "Intentional error.";
$mw->afterIdle(sub {
$mw->after(100, \&first_error);
die "$errmsg\n";
});
$mw->after(20*1000, sub {
if (Tk::Exists($mw)) {
$mw->destroy;
fail "Timeout - destroyed main window";
}
});
MainLoop;
# fills $ed
sub first_error {
my $dialog = search_error_dialog($mw);
isa_ok($dialog, "Tk::Dialog", "dialog");
$ed = $dialog;
my $error_stacktrace_toplevel = search_error_stacktrace_toplevel($mw);
isa_ok($error_stacktrace_toplevel, 'Tk::ErrorDialog', 'Found stacktrace window');
is($error_stacktrace_toplevel->state, 'withdrawn', 'Stacktrace not visible');
$error_stacktrace_toplevel->geometry('+0+0'); # for WMs with interactive placement
$dialog->SelectButton('Stack trace');
second_error();
}
sub second_error {
$mw->afterIdle(sub { die "$errmsg\n" });
$mw->after(100, sub {
my $dialog = search_error_dialog($mw);
is($ed, $dialog, "ErrorDialog reused");
$dialog->Exit;
$mw->after(100, sub { $mw->destroy });
});
}
sub search_error_dialog {
my $w = shift;
my $dialog;
$w->Walk(sub {
return if $dialog;
for my $opt (qw(text message)) {
my $val = eval { $_[0]->cget("-$opt") };
if (defined $val && $val =~ m{\Q$errmsg}) {
$dialog = $_[0]->toplevel;
}
}
});
$dialog;
}
sub search_error_stacktrace_toplevel {
my $w = shift;
my $toplevel;
$w->Walk(sub {
return if $toplevel;
if ($_[0]->isa('Tk::ErrorDialog')) {
$toplevel = $_[0];
}
});
$toplevel;
}
__END__
|