BEGIN {
require
5 }
sub
DEBUG { 0 }
{
my
$warning_count
;
my
$stacktraces
;
my
$stacktraces_count
= 0;
sub
nowarnings_handler {
my
(
$msg
) =
@_
;
unless
(
defined
$msg
&&
$msg
=~ /^Argument
"[0-9._]+"
isn't numeric in numeric gt/) {
$warning_count
++;
$stacktraces_count
++;
$stacktraces
.=
"\n"
. Devel::StackTrace->new->as_string() .
"\n"
;
}
}
warn
@_
;
}
sub
nowarnings {
$SIG
{
'__WARN__'
} = \
&nowarnings_handler
;
}
END {
if
(
$warning_count
) {
MyTestHelpers::diag (
"Saw $warning_count warning(s):"
);
if
(
defined
$stacktraces
) {
MyTestHelpers::diag (
$stacktraces
);
}
else
{
MyTestHelpers::diag(
'(Devel::StackTrace not available for backtrace)'
);
}
MyTestHelpers::diag (
'Exit code 1 for warnings'
);
$? = 1;
}
}
}
sub
diag {
if
(
do
{
local
$@;
eval
{ Test::More->can(
'diag'
) }}) {
Test::More::diag (
@_
);
}
else
{
my
$msg
=
join
(
''
,
map
{
defined
(
$_
)?
$_
:
'[undef]'
}
@_
).
"\n"
;
$msg
=~ s/^/
print
STDERR
$msg
;
}
}
sub
dump
{
my
(
$thing
) =
@_
;
MyTestHelpers::diag (Data::Dumper::Dumper (
$thing
));
}
else
{
MyTestHelpers::diag (
"Data::Dumper not available"
);
}
}
sub
findrefs {
my
(
$obj
) =
@_
;
defined
$obj
or
return
;
if
(
ref
$obj
&& Scalar::Util::reftype(
$obj
) eq
'HASH'
) {
MyTestHelpers::diag (
"Keys: "
,
join
(
' '
,
map
{
"$_="
.(
defined
$obj
->{
$_
}
?
"$obj->{$_}"
:
'[undef]'
)}
keys
%$obj
));
}
MyTestHelpers::diag (Devel::FindRef::track(
$obj
, 8));
}
else
{
MyTestHelpers::diag (
"Devel::FindRef not available -- "
, $@);
}
}
sub
test_weaken_show_leaks {
my
(
$leaks
) =
@_
;
$leaks
||
return
;
my
$unfreed
=
$leaks
->unfreed_proberefs;
my
$unfreed_count
=
scalar
(
@$unfreed
);
MyTestHelpers::diag (
"Test-Weaken leaks $unfreed_count objects"
);
MyTestHelpers::
dump
(
$leaks
);
my
$proberef
;
foreach
$proberef
(
@$unfreed
) {
MyTestHelpers::diag (
" unfreed "
,
$proberef
);
}
foreach
$proberef
(
@$unfreed
) {
MyTestHelpers::diag (
"search "
,
$proberef
);
MyTestHelpers::findrefs(
$proberef
);
}
}
sub
main_iterations {
my
$count
= 0;
if
(DEBUG) { MyTestHelpers::diag (
"main_iterations() ..."
); }
while
(Gtk2->events_pending) {
$count
++;
Gtk2->main_iteration_do (0);
if
(
$count
>= 500) {
MyTestHelpers::diag (
"main_iterations(): oops, bailed out after $count events/iterations"
);
return
;
}
}
MyTestHelpers::diag (
"main_iterations(): ran $count events/iterations"
);
}
sub
warn_suppress_gtk_icon {
my
(
$message
) =
@_
;
unless
(
$message
=~ /Gtk-WARNING.
*icon
/
||
$message
=~ /\Qrecently-used.xbel/
) {
warn
@_
;
}
}
sub
glib_gtk_versions {
my
$gtk1_loaded
= Gtk->can(
'init'
);
my
$gtk2_loaded
= Gtk2->can(
'init'
);
my
$glib_loaded
= Glib->can(
'get_home_dir'
);
if
(
$gtk1_loaded
) {
MyTestHelpers::diag (
"Perl-Gtk1 version "
,Gtk->VERSION);
}
if
(
$gtk2_loaded
) {
MyTestHelpers::diag (
"Perl-Gtk2 version "
,Gtk2->VERSION);
}
if
(
$glib_loaded
) {
MyTestHelpers::diag (
"Perl-Glib version "
,Glib->VERSION);
MyTestHelpers::diag (
"Compiled against Glib version "
,
Glib::MAJOR_VERSION(),
"."
,
Glib::MINOR_VERSION(),
"."
,
Glib::MICRO_VERSION(),
"."
);
MyTestHelpers::diag (
"Running on Glib version "
,
Glib::major_version(),
"."
,
Glib::minor_version(),
"."
,
Glib::micro_version(),
"."
);
}
if
(
$gtk2_loaded
) {
MyTestHelpers::diag (
"Compiled against Gtk version "
,
Gtk2::MAJOR_VERSION(),
"."
,
Gtk2::MINOR_VERSION(),
"."
,
Gtk2::MICRO_VERSION(),
"."
);
MyTestHelpers::diag (
"Running on Gtk version "
,
Gtk2::major_version(),
"."
,
Gtk2::minor_version(),
"."
,
Gtk2::micro_version(),
"."
);
}
if
(
$gtk1_loaded
) {
MyTestHelpers::diag (
"Running on Gtk version "
,
Gtk->major_version(),
"."
,
Gtk->minor_version(),
"."
,
Gtk->micro_version(),
"."
);
}
}
sub
any_signal_connections {
my
(
$obj
) =
@_
;
my
@connected
=
grep
{
$obj
->signal_handler_is_connected (
$_
)} (1 .. 500);
if
(
@connected
) {
my
$connected
=
join
(
','
,
@connected
);
MyTestHelpers::diag (
"$obj signal handlers connected: $connected"
);
return
$connected
;
}
return
undef
;
}
sub
wait_for_event {
my
(
$widget
,
$signame
) =
@_
;
if
(DEBUG) { MyTestHelpers::diag (
"wait_for_event() $signame on "
,
$widget
); }
my
$done
= 0;
my
$got_event
= 0;
my
$sig_id
=
$widget
->signal_connect
(
$signame
=>
sub
{
if
(DEBUG) { MyTestHelpers::diag (
"wait_for_event() $signame received"
); }
$done
= 1;
return
0;
});
my
$timer_id
= Glib::Timeout->add
(30_000,
sub
{
$done
= 1;
MyTestHelpers::diag (
"wait_for_event() oops, timeout waiting for $signame on "
,
$widget
);
return
1;
});
if
(
$widget
->can(
'get_display'
)) {
$widget
->get_display->sync;
}
else
{
Gtk2::Gdk->flush;
}
my
$count
= 0;
while
(!
$done
) {
if
(DEBUG >= 2) { MyTestHelpers::diag (
"wait_for_event() iteration $count"
); }
Gtk2->main_iteration;
$count
++;
}
MyTestHelpers::diag (
"wait_for_event(): '$signame' ran $count events/iterations\n"
);
$widget
->signal_handler_disconnect (
$sig_id
);
Glib::Source->remove (
$timer_id
);
}
sub
X11_chosen_screen_number {
my
(
$X
) =
@_
;
my
$i
;
foreach
$i
(0 .. $
if
(
$X
->{
'screens'
}->[
$i
]->{
'root'
} ==
$X
->{
'root'
}) {
return
$i
;
}
}
die
"Oops, current screen not found"
;
}
sub
X11_server_info {
my
(
$X
) =
@_
;
MyTestHelpers::diag(
""
);
MyTestHelpers::diag(
"X server info"
);
MyTestHelpers::diag(
"vendor: "
,
$X
->{
'vendor'
});
MyTestHelpers::diag(
"release_number: "
,
$X
->{
'release_number'
});
MyTestHelpers::diag(
"protocol_major_version: "
,
$X
->{
'protocol_major_version'
});
MyTestHelpers::diag(
"protocol_minor_version: "
,
$X
->{
'protocol_minor_version'
});
MyTestHelpers::diag(
"byte_order: "
,
$X
->{
'byte_order'
});
MyTestHelpers::diag(
"num screens: "
,
scalar
(@{
$X
->{
'screens'
}}));
MyTestHelpers::diag(
"width_in_pixels: "
,
$X
->{
'width_in_pixels'
});
MyTestHelpers::diag(
"height_in_pixels: "
,
$X
->{
'height_in_pixels'
});
MyTestHelpers::diag(
"width_in_millimeters: "
,
$X
->{
'width_in_millimeters'
});
MyTestHelpers::diag(
"height_in_millimeters: "
,
$X
->{
'height_in_millimeters'
});
MyTestHelpers::diag(
"root_visual: "
,
$X
->{
'root_visual'
});
my
$visual_info
=
$X
->{
'visuals'
}->{
$X
->{
'root_visual'
}};
MyTestHelpers::diag(
" depth: "
,
$visual_info
->{
'depth'
});
MyTestHelpers::diag(
" class: "
,
$visual_info
->{
'class'
},
' '
,
$X
->interp(
'VisualClass'
,
$visual_info
->{
'class'
}));
MyTestHelpers::diag(
" colormap_entries: "
,
$visual_info
->{
'colormap_entries'
});
MyTestHelpers::diag(
" bits_per_rgb_value: "
,
$visual_info
->{
'bits_per_rgb_value'
});
MyTestHelpers::diag(
" red_mask: "
,
sprintf
(
'%#X'
,
$visual_info
->{
'red_mask'
}));
MyTestHelpers::diag(
" green_mask: "
,
sprintf
(
'%#X'
,
$visual_info
->{
'green_mask'
}));
MyTestHelpers::diag(
" blue_mask: "
,
sprintf
(
'%#X'
,
$visual_info
->{
'blue_mask'
}));
MyTestHelpers::diag(
"ima"
.
"ge_byte_order: "
,
$X
->{
'ima'
.
'ge_byte_order'
},
' '
,
$X
->interp(
'Significance'
,
$X
->{
'ima'
.
'ge_byte_order'
}));
MyTestHelpers::diag(
"black_pixel: "
,
sprintf
(
'%#X'
,
$X
->{
'black_pixel'
}));
MyTestHelpers::diag(
"white_pixel: "
,
sprintf
(
'%#X'
,
$X
->{
'white_pixel'
}));
foreach
(0 .. $
if
(
$X
->{
'screens'
}->[
$_
]->{
'root'
} ==
$X
->{
'root'
}) {
MyTestHelpers::diag(
"chosen screen: $_"
);
}
}
MyTestHelpers::diag(
""
);
}
1;