File: errordialog.t

package info (click to toggle)
perl-tk 1%3A804.036%2Bdfsg1-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 35,284 kB
  • sloc: ansic: 349,560; perl: 52,292; sh: 12,678; makefile: 5,700; asm: 3,565; ada: 1,681; pascal: 1,082; cpp: 1,006; yacc: 883; cs: 879
file content (96 lines) | stat: -rwxr-xr-x 1,910 bytes parent folder | download | duplicates (5)
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__