xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/lib/Test2/Event/Generic.pm (revision 5486feefcc8cb79b19e014ab332cc5dfd05b3b33)
15759b3d2Safresh1package Test2::Event::Generic;
25759b3d2Safresh1use strict;
35759b3d2Safresh1use warnings;
45759b3d2Safresh1
55759b3d2Safresh1use Carp qw/croak/;
65759b3d2Safresh1use Scalar::Util qw/reftype/;
75759b3d2Safresh1
8*5486feefSafresh1our $VERSION = '1.302199';
95759b3d2Safresh1
105759b3d2Safresh1BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) }
115759b3d2Safresh1use Test2::Util::HashBase;
125759b3d2Safresh1
135759b3d2Safresh1my @FIELDS = qw{
145759b3d2Safresh1    causes_fail increments_count diagnostics no_display callback terminate
155759b3d2Safresh1    global sets_plan summary facet_data
165759b3d2Safresh1};
175759b3d2Safresh1my %DEFAULTS = (
185759b3d2Safresh1    causes_fail      => 0,
195759b3d2Safresh1    increments_count => 0,
205759b3d2Safresh1    diagnostics      => 0,
215759b3d2Safresh1    no_display       => 0,
225759b3d2Safresh1);
235759b3d2Safresh1
245759b3d2Safresh1sub init {
255759b3d2Safresh1    my $self = shift;
265759b3d2Safresh1
275759b3d2Safresh1    for my $field (@FIELDS) {
285759b3d2Safresh1        my $val = defined $self->{$field} ? delete $self->{$field} : $DEFAULTS{$field};
295759b3d2Safresh1        next unless defined $val;
305759b3d2Safresh1
315759b3d2Safresh1        my $set = "set_$field";
325759b3d2Safresh1        $self->$set($val);
335759b3d2Safresh1    }
345759b3d2Safresh1}
355759b3d2Safresh1
365759b3d2Safresh1for my $field (@FIELDS) {
375759b3d2Safresh1    no strict 'refs';
385759b3d2Safresh1
395759b3d2Safresh1    *$field = sub { exists $_[0]->{$field} ? $_[0]->{$field} : () }
405759b3d2Safresh1        unless exists &{$field};
415759b3d2Safresh1
425759b3d2Safresh1    *{"set_$field"} = sub { $_[0]->{$field} = $_[1] }
435759b3d2Safresh1        unless exists &{"set_$field"};
445759b3d2Safresh1}
455759b3d2Safresh1
465759b3d2Safresh1sub can {
475759b3d2Safresh1    my $self = shift;
485759b3d2Safresh1    my ($name) = @_;
495759b3d2Safresh1    return $self->SUPER::can($name) unless $name eq 'callback';
505759b3d2Safresh1    return $self->{callback} || \&Test2::Event::callback;
515759b3d2Safresh1}
525759b3d2Safresh1
535759b3d2Safresh1sub facet_data {
545759b3d2Safresh1    my $self = shift;
555759b3d2Safresh1    return $self->{facet_data} || $self->SUPER::facet_data();
565759b3d2Safresh1}
575759b3d2Safresh1
585759b3d2Safresh1sub summary {
595759b3d2Safresh1    my $self = shift;
605759b3d2Safresh1    return $self->{summary} if defined $self->{summary};
615759b3d2Safresh1    $self->SUPER::summary();
625759b3d2Safresh1}
635759b3d2Safresh1
645759b3d2Safresh1sub sets_plan {
655759b3d2Safresh1    my $self = shift;
665759b3d2Safresh1    return unless $self->{sets_plan};
675759b3d2Safresh1    return @{$self->{sets_plan}};
685759b3d2Safresh1}
695759b3d2Safresh1
705759b3d2Safresh1sub callback {
715759b3d2Safresh1    my $self = shift;
725759b3d2Safresh1    my $cb = $self->{callback} || return;
735759b3d2Safresh1    $self->$cb(@_);
745759b3d2Safresh1}
755759b3d2Safresh1
765759b3d2Safresh1sub set_global {
775759b3d2Safresh1    my $self = shift;
785759b3d2Safresh1    my ($bool) = @_;
795759b3d2Safresh1
805759b3d2Safresh1    if(!defined $bool) {
815759b3d2Safresh1        delete $self->{global};
825759b3d2Safresh1        return undef;
835759b3d2Safresh1    }
845759b3d2Safresh1
855759b3d2Safresh1    $self->{global} = $bool;
865759b3d2Safresh1}
875759b3d2Safresh1
885759b3d2Safresh1sub set_callback {
895759b3d2Safresh1    my $self = shift;
905759b3d2Safresh1    my ($cb) = @_;
915759b3d2Safresh1
925759b3d2Safresh1    if(!defined $cb) {
935759b3d2Safresh1        delete $self->{callback};
945759b3d2Safresh1        return undef;
955759b3d2Safresh1    }
965759b3d2Safresh1
975759b3d2Safresh1    croak "callback must be a code reference"
985759b3d2Safresh1        unless ref($cb) && reftype($cb) eq 'CODE';
995759b3d2Safresh1
1005759b3d2Safresh1    $self->{callback} = $cb;
1015759b3d2Safresh1}
1025759b3d2Safresh1
1035759b3d2Safresh1sub set_terminate {
1045759b3d2Safresh1    my $self = shift;
1055759b3d2Safresh1    my ($exit) = @_;
1065759b3d2Safresh1
1075759b3d2Safresh1    if(!defined $exit) {
1085759b3d2Safresh1        delete $self->{terminate};
1095759b3d2Safresh1        return undef;
1105759b3d2Safresh1    }
1115759b3d2Safresh1
1125759b3d2Safresh1    croak "terminate must be a positive integer"
1135759b3d2Safresh1       unless $exit =~ m/^\d+$/;
1145759b3d2Safresh1
1155759b3d2Safresh1    $self->{terminate} = $exit;
1165759b3d2Safresh1}
1175759b3d2Safresh1
1185759b3d2Safresh1sub set_sets_plan {
1195759b3d2Safresh1    my $self = shift;
1205759b3d2Safresh1    my ($plan) = @_;
1215759b3d2Safresh1
1225759b3d2Safresh1    if(!defined $plan) {
1235759b3d2Safresh1        delete $self->{sets_plan};
1245759b3d2Safresh1        return undef;
1255759b3d2Safresh1    }
1265759b3d2Safresh1
1275759b3d2Safresh1    croak "'sets_plan' must be an array reference"
1285759b3d2Safresh1        unless ref($plan) && reftype($plan) eq 'ARRAY';
1295759b3d2Safresh1
1305759b3d2Safresh1    $self->{sets_plan} = $plan;
1315759b3d2Safresh1}
1325759b3d2Safresh1
1335759b3d2Safresh11;
1345759b3d2Safresh1
1355759b3d2Safresh1__END__
1365759b3d2Safresh1
1375759b3d2Safresh1=pod
1385759b3d2Safresh1
1395759b3d2Safresh1=encoding UTF-8
1405759b3d2Safresh1
1415759b3d2Safresh1=head1 NAME
1425759b3d2Safresh1
1435759b3d2Safresh1Test2::Event::Generic - Generic event type.
1445759b3d2Safresh1
1455759b3d2Safresh1=head1 DESCRIPTION
1465759b3d2Safresh1
1475759b3d2Safresh1This is a generic event that lets you customize all fields in the event API.
1485759b3d2Safresh1This is useful if you have need for a custom event that does not make sense as
1495759b3d2Safresh1a published reusable event subclass.
1505759b3d2Safresh1
1515759b3d2Safresh1=head1 SYNOPSIS
1525759b3d2Safresh1
1535759b3d2Safresh1    use Test2::API qw/context/;
1545759b3d2Safresh1
1555759b3d2Safresh1    sub send_custom_fail {
1565759b3d2Safresh1        my $ctx = shift;
1575759b3d2Safresh1
1585759b3d2Safresh1        $ctx->send_event('Generic', causes_fail => 1, summary => 'The sky is falling');
1595759b3d2Safresh1
1605759b3d2Safresh1        $ctx->release;
1615759b3d2Safresh1    }
1625759b3d2Safresh1
1635759b3d2Safresh1    send_custom_fail();
1645759b3d2Safresh1
1655759b3d2Safresh1=head1 METHODS
1665759b3d2Safresh1
1675759b3d2Safresh1=over 4
1685759b3d2Safresh1
1695759b3d2Safresh1=item $e->facet_data($data)
1705759b3d2Safresh1
1715759b3d2Safresh1=item $data = $e->facet_data
1725759b3d2Safresh1
1735759b3d2Safresh1Get or set the facet data (see L<Test2::Event>). If no facet_data is set then
1745759b3d2Safresh1C<< Test2::Event->facet_data >> will be called to produce facets from the other
1755759b3d2Safresh1data.
1765759b3d2Safresh1
1775759b3d2Safresh1=item $e->callback($hub)
1785759b3d2Safresh1
1795759b3d2Safresh1Call the custom callback if one is set, otherwise this does nothing.
1805759b3d2Safresh1
1815759b3d2Safresh1=item $e->set_callback(sub { ... })
1825759b3d2Safresh1
1835759b3d2Safresh1Set the custom callback. The custom callback must be a coderef. The first
1845759b3d2Safresh1argument to your callback will be the event itself, the second will be the
1855759b3d2Safresh1L<Test2::Event::Hub> that is using the callback.
1865759b3d2Safresh1
1875759b3d2Safresh1=item $bool = $e->causes_fail
1885759b3d2Safresh1
1895759b3d2Safresh1=item $e->set_causes_fail($bool)
1905759b3d2Safresh1
1915759b3d2Safresh1Get/Set the C<causes_fail> attribute. This defaults to C<0>.
1925759b3d2Safresh1
1935759b3d2Safresh1=item $bool = $e->diagnostics
1945759b3d2Safresh1
1955759b3d2Safresh1=item $e->set_diagnostics($bool)
1965759b3d2Safresh1
1975759b3d2Safresh1Get/Set the C<diagnostics> attribute. This defaults to C<0>.
1985759b3d2Safresh1
1995759b3d2Safresh1=item $bool_or_undef = $e->global
2005759b3d2Safresh1
2015759b3d2Safresh1=item @bool_or_empty = $e->global
2025759b3d2Safresh1
2035759b3d2Safresh1=item $e->set_global($bool_or_undef)
2045759b3d2Safresh1
2055759b3d2Safresh1Get/Set the C<diagnostics> attribute. This defaults to an empty list which is
2065759b3d2Safresh1undef in scalar context.
2075759b3d2Safresh1
2085759b3d2Safresh1=item $bool = $e->increments_count
2095759b3d2Safresh1
2105759b3d2Safresh1=item $e->set_increments_count($bool)
2115759b3d2Safresh1
2125759b3d2Safresh1Get/Set the C<increments_count> attribute. This defaults to C<0>.
2135759b3d2Safresh1
2145759b3d2Safresh1=item $bool = $e->no_display
2155759b3d2Safresh1
2165759b3d2Safresh1=item $e->set_no_display($bool)
2175759b3d2Safresh1
2185759b3d2Safresh1Get/Set the C<no_display> attribute. This defaults to C<0>.
2195759b3d2Safresh1
2205759b3d2Safresh1=item @plan = $e->sets_plan
2215759b3d2Safresh1
2225759b3d2Safresh1Get the plan if this event sets one. The plan is a list of up to 3 items:
2235759b3d2Safresh1C<($count, $directive, $reason)>. C<$count> must be defined, the others may be
2245759b3d2Safresh1undef, or may not exist at all.
2255759b3d2Safresh1
2265759b3d2Safresh1=item $e->set_sets_plan(\@plan)
2275759b3d2Safresh1
2285759b3d2Safresh1Set the plan. You must pass in an arrayref with up to 3 elements.
2295759b3d2Safresh1
2305759b3d2Safresh1=item $summary = $e->summary
2315759b3d2Safresh1
2325759b3d2Safresh1=item $e->set_summary($summary_or_undef)
2335759b3d2Safresh1
2345759b3d2Safresh1Get/Set the summary. This will default to the event package
2355759b3d2Safresh1C<'Test2::Event::Generic'>. You can set it to any value. Setting this to
2365759b3d2Safresh1C<undef> will reset it to the default.
2375759b3d2Safresh1
2385759b3d2Safresh1=item $int_or_undef = $e->terminate
2395759b3d2Safresh1
2405759b3d2Safresh1=item @int_or_empty = $e->terminate
2415759b3d2Safresh1
2425759b3d2Safresh1=item $e->set_terminate($int_or_undef)
2435759b3d2Safresh1
2445759b3d2Safresh1This will get/set the C<terminate> attribute. This defaults to undef in scalar
2455759b3d2Safresh1context, or an empty list in list context. Setting this to undef will clear it
2465759b3d2Safresh1completely. This must be set to a positive integer (0 or larger).
2475759b3d2Safresh1
2485759b3d2Safresh1=back
2495759b3d2Safresh1
2505759b3d2Safresh1=head1 SOURCE
2515759b3d2Safresh1
2525759b3d2Safresh1The source code repository for Test2 can be found at
253*5486feefSafresh1L<https://github.com/Test-More/test-more/>.
2545759b3d2Safresh1
2555759b3d2Safresh1=head1 MAINTAINERS
2565759b3d2Safresh1
2575759b3d2Safresh1=over 4
2585759b3d2Safresh1
2595759b3d2Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt>
2605759b3d2Safresh1
2615759b3d2Safresh1=back
2625759b3d2Safresh1
2635759b3d2Safresh1=head1 AUTHORS
2645759b3d2Safresh1
2655759b3d2Safresh1=over 4
2665759b3d2Safresh1
2675759b3d2Safresh1=item Chad Granum E<lt>exodist@cpan.orgE<gt>
2685759b3d2Safresh1
2695759b3d2Safresh1=back
2705759b3d2Safresh1
2715759b3d2Safresh1=head1 COPYRIGHT
2725759b3d2Safresh1
273256a93a4Safresh1Copyright 2020 Chad Granum E<lt>exodist@cpan.orgE<gt>.
2745759b3d2Safresh1
2755759b3d2Safresh1This program is free software; you can redistribute it and/or
2765759b3d2Safresh1modify it under the same terms as Perl itself.
2775759b3d2Safresh1
278*5486feefSafresh1See L<https://dev.perl.org/licenses/>
2795759b3d2Safresh1
2805759b3d2Safresh1=cut
281