our
$VERSION
=
'1.302210'
;
<events
+down_sig +down_buffer
+up_into +up_sig +up_clear
}
;
sub
init {
my
$self
=
shift
;
croak
"'events' is a required attribute"
unless
$self
->{+EVENTS};
}
sub
can_squash {
my
$self
=
shift
;
my
(
$event
) =
@_
;
return
unless
$event
->has_info;
return
if
first {
$event
->
$_
}
'causes_fail'
,
'has_assert'
,
'has_bailout'
,
'has_errors'
,
'has_plan'
,
'has_subtest'
;
return
$event
->trace_signature;
}
sub
process {
my
$self
=
shift
;
my
(
$event
) =
@_
;
return
if
$self
->squash_up(
$event
);
return
if
$self
->squash_down(
$event
);
$self
->flush_down(
$event
);
push
@{
$self
->{+EVENTS}} =>
$event
;
return
;
}
sub
squash_down {
my
$self
=
shift
;
my
(
$event
) =
@_
;
my
$sig
=
$self
->can_squash(
$event
)
or
return
;
$self
->flush_down()
if
$self
->{+DOWN_SIG} &&
$self
->{+DOWN_SIG} ne
$sig
;
$self
->{+DOWN_SIG} ||=
$sig
;
push
@{
$self
->{+DOWN_BUFFER}} =>
$event
;
return
1;
}
sub
flush_down {
my
$self
=
shift
;
my
(
$into
) =
@_
;
my
$sig
=
delete
$self
->{+DOWN_SIG};
my
$buffer
=
delete
$self
->{+DOWN_BUFFER};
return
unless
$buffer
&&
@$buffer
;
my
$fsig
=
$into
?
$into
->trace_signature :
undef
;
if
(
$fsig
&&
$fsig
eq
$sig
) {
$self
->squash(
$into
,
@$buffer
);
}
else
{
push
@{
$self
->{+EVENTS}} =>
@$buffer
if
$buffer
;
}
}
sub
clear_up {
my
$self
=
shift
;
return
unless
$self
->{+UP_CLEAR};
delete
$self
->{+UP_INTO};
delete
$self
->{+UP_SIG};
delete
$self
->{+UP_CLEAR};
}
sub
squash_up {
my
$self
=
shift
;
my
(
$event
) =
@_
;
no
warnings
'uninitialized'
;
$self
->clear_up;
if
(
$event
->has_assert) {
if
(
my
$sig
=
$event
->trace_signature) {
$self
->{+UP_INTO} =
$event
;
$self
->{+UP_SIG} =
$sig
;
$self
->{+UP_CLEAR} = 0;
}
else
{
$self
->{+UP_CLEAR} = 1;
$self
->clear_up;
}
return
;
}
my
$into
=
$self
->{+UP_INTO} or
return
;
$self
->{+UP_CLEAR} = 1;
my
$sig
=
$self
->can_squash(
$event
);
return
unless
$sig
eq
$self
->{+UP_SIG};
$self
->{+UP_CLEAR} = 0;
$self
->squash(
$into
,
$event
);
return
1;
}
sub
squash {
my
$self
=
shift
;
my
(
$into
,
@from
) =
@_
;
push
@{
$into
->facet_data->{info}} =>
$_
->info
for
@from
;
}
sub
DESTROY {
my
$self
=
shift
;
return
unless
$self
->{+EVENTS};
$self
->flush_down();
return
;
}
1;