1256a93a4Safresh1package Test2::API::InterceptResult::Squasher; 2256a93a4Safresh1use strict; 3256a93a4Safresh1use warnings; 4256a93a4Safresh1 5*5486feefSafresh1our $VERSION = '1.302199'; 6256a93a4Safresh1 7256a93a4Safresh1use Carp qw/croak/; 8256a93a4Safresh1use List::Util qw/first/; 9256a93a4Safresh1 10256a93a4Safresh1use Test2::Util::HashBase qw{ 11256a93a4Safresh1 <events 12256a93a4Safresh1 13256a93a4Safresh1 +down_sig +down_buffer 14256a93a4Safresh1 15256a93a4Safresh1 +up_into +up_sig +up_clear 16256a93a4Safresh1}; 17256a93a4Safresh1 18256a93a4Safresh1sub init { 19256a93a4Safresh1 my $self = shift; 20256a93a4Safresh1 21256a93a4Safresh1 croak "'events' is a required attribute" unless $self->{+EVENTS}; 22256a93a4Safresh1} 23256a93a4Safresh1 24256a93a4Safresh1sub can_squash { 25256a93a4Safresh1 my $self = shift; 26256a93a4Safresh1 my ($event) = @_; 27256a93a4Safresh1 28256a93a4Safresh1 # No info, no squash 29256a93a4Safresh1 return unless $event->has_info; 30256a93a4Safresh1 31256a93a4Safresh1 # Do not merge up if one of these is true 32256a93a4Safresh1 return if first { $event->$_ } 'causes_fail', 'has_assert', 'has_bailout', 'has_errors', 'has_plan', 'has_subtest'; 33256a93a4Safresh1 34256a93a4Safresh1 # Signature if we can squash 35256a93a4Safresh1 return $event->trace_signature; 36256a93a4Safresh1} 37256a93a4Safresh1 38256a93a4Safresh1sub process { 39256a93a4Safresh1 my $self = shift; 40256a93a4Safresh1 my ($event) = @_; 41256a93a4Safresh1 42256a93a4Safresh1 return if $self->squash_up($event); 43256a93a4Safresh1 return if $self->squash_down($event); 44256a93a4Safresh1 45256a93a4Safresh1 $self->flush_down($event); 46256a93a4Safresh1 47256a93a4Safresh1 push @{$self->{+EVENTS}} => $event; 48256a93a4Safresh1 49256a93a4Safresh1 return; 50256a93a4Safresh1} 51256a93a4Safresh1 52256a93a4Safresh1sub squash_down { 53256a93a4Safresh1 my $self = shift; 54256a93a4Safresh1 my ($event) = @_; 55256a93a4Safresh1 56256a93a4Safresh1 my $sig = $self->can_squash($event) 57256a93a4Safresh1 or return; 58256a93a4Safresh1 59256a93a4Safresh1 $self->flush_down() 60256a93a4Safresh1 if $self->{+DOWN_SIG} && $self->{+DOWN_SIG} ne $sig; 61256a93a4Safresh1 62256a93a4Safresh1 $self->{+DOWN_SIG} ||= $sig; 63256a93a4Safresh1 push @{$self->{+DOWN_BUFFER}} => $event; 64256a93a4Safresh1 65256a93a4Safresh1 return 1; 66256a93a4Safresh1} 67256a93a4Safresh1 68256a93a4Safresh1sub flush_down { 69256a93a4Safresh1 my $self = shift; 70256a93a4Safresh1 my ($into) = @_; 71256a93a4Safresh1 72256a93a4Safresh1 my $sig = delete $self->{+DOWN_SIG}; 73256a93a4Safresh1 my $buffer = delete $self->{+DOWN_BUFFER}; 74256a93a4Safresh1 75256a93a4Safresh1 return unless $buffer && @$buffer; 76256a93a4Safresh1 77256a93a4Safresh1 my $fsig = $into ? $into->trace_signature : undef; 78256a93a4Safresh1 79256a93a4Safresh1 if ($fsig && $fsig eq $sig) { 80256a93a4Safresh1 $self->squash($into, @$buffer); 81256a93a4Safresh1 } 82256a93a4Safresh1 else { 83256a93a4Safresh1 push @{$self->{+EVENTS}} => @$buffer if $buffer; 84256a93a4Safresh1 } 85256a93a4Safresh1} 86256a93a4Safresh1 87256a93a4Safresh1sub clear_up { 88256a93a4Safresh1 my $self = shift; 89256a93a4Safresh1 90256a93a4Safresh1 return unless $self->{+UP_CLEAR}; 91256a93a4Safresh1 92256a93a4Safresh1 delete $self->{+UP_INTO}; 93256a93a4Safresh1 delete $self->{+UP_SIG}; 94256a93a4Safresh1 delete $self->{+UP_CLEAR}; 95256a93a4Safresh1} 96256a93a4Safresh1 97256a93a4Safresh1sub squash_up { 98256a93a4Safresh1 my $self = shift; 99256a93a4Safresh1 my ($event) = @_; 100256a93a4Safresh1 no warnings 'uninitialized'; 101256a93a4Safresh1 102256a93a4Safresh1 $self->clear_up; 103256a93a4Safresh1 104256a93a4Safresh1 if ($event->has_assert) { 105256a93a4Safresh1 if(my $sig = $event->trace_signature) { 106256a93a4Safresh1 $self->{+UP_INTO} = $event; 107256a93a4Safresh1 $self->{+UP_SIG} = $sig; 108256a93a4Safresh1 $self->{+UP_CLEAR} = 0; 109256a93a4Safresh1 } 110256a93a4Safresh1 else { 111256a93a4Safresh1 $self->{+UP_CLEAR} = 1; 112256a93a4Safresh1 $self->clear_up; 113256a93a4Safresh1 } 114256a93a4Safresh1 115256a93a4Safresh1 return; 116256a93a4Safresh1 } 117256a93a4Safresh1 118256a93a4Safresh1 my $into = $self->{+UP_INTO} or return; 119256a93a4Safresh1 120256a93a4Safresh1 # Next iteration should clear unless something below changes that 121256a93a4Safresh1 $self->{+UP_CLEAR} = 1; 122256a93a4Safresh1 123256a93a4Safresh1 # Only merge into matching trace signatres 124256a93a4Safresh1 my $sig = $self->can_squash($event); 125256a93a4Safresh1 return unless $sig eq $self->{+UP_SIG}; 126256a93a4Safresh1 127256a93a4Safresh1 # OK Merge! Do not clear merge in case the return event is also a matching sig diag-only 128256a93a4Safresh1 $self->{+UP_CLEAR} = 0; 129256a93a4Safresh1 130256a93a4Safresh1 $self->squash($into, $event); 131256a93a4Safresh1 132256a93a4Safresh1 return 1; 133256a93a4Safresh1} 134256a93a4Safresh1 135256a93a4Safresh1sub squash { 136256a93a4Safresh1 my $self = shift; 137256a93a4Safresh1 my ($into, @from) = @_; 138256a93a4Safresh1 push @{$into->facet_data->{info}} => $_->info for @from; 139256a93a4Safresh1} 140256a93a4Safresh1 141256a93a4Safresh1sub DESTROY { 142256a93a4Safresh1 my $self = shift; 143256a93a4Safresh1 144256a93a4Safresh1 return unless $self->{+EVENTS}; 145256a93a4Safresh1 $self->flush_down(); 146256a93a4Safresh1 return; 147256a93a4Safresh1} 148256a93a4Safresh1 149256a93a4Safresh11; 150256a93a4Safresh1 151256a93a4Safresh1__END__ 152256a93a4Safresh1 153256a93a4Safresh1=pod 154256a93a4Safresh1 155256a93a4Safresh1=encoding UTF-8 156256a93a4Safresh1 157256a93a4Safresh1=head1 NAME 158256a93a4Safresh1 159256a93a4Safresh1Test2::API::InterceptResult::Squasher - Encapsulation of the algorithm that 160256a93a4Safresh1squashes diags into assertions. 161256a93a4Safresh1 162256a93a4Safresh1=head1 DESCRIPTION 163256a93a4Safresh1 164256a93a4Safresh1Internal use only, please ignore. 165256a93a4Safresh1 166256a93a4Safresh1=head1 SOURCE 167256a93a4Safresh1 168256a93a4Safresh1The source code repository for Test2 can be found at 169*5486feefSafresh1L<https://github.com/Test-More/test-more/>. 170256a93a4Safresh1 171256a93a4Safresh1=head1 MAINTAINERS 172256a93a4Safresh1 173256a93a4Safresh1=over 4 174256a93a4Safresh1 175256a93a4Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt> 176256a93a4Safresh1 177256a93a4Safresh1=back 178256a93a4Safresh1 179256a93a4Safresh1=head1 AUTHORS 180256a93a4Safresh1 181256a93a4Safresh1=over 4 182256a93a4Safresh1 183256a93a4Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt> 184256a93a4Safresh1 185256a93a4Safresh1=back 186256a93a4Safresh1 187256a93a4Safresh1=head1 COPYRIGHT 188256a93a4Safresh1 189256a93a4Safresh1Copyright 2020 Chad Granum E<lt>exodist@cpan.orgE<gt>. 190256a93a4Safresh1 191256a93a4Safresh1This program is free software; you can redistribute it and/or 192256a93a4Safresh1modify it under the same terms as Perl itself. 193256a93a4Safresh1 194*5486feefSafresh1See L<https://dev.perl.org/licenses/> 195256a93a4Safresh1 196256a93a4Safresh1=cut 197