xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/API/InterceptResult/Squasher.pm (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
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