⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aggregator.pm

📁 视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.
💻 PM
字号:
package TAP::Parser::Aggregator;use strict;use Benchmark;use vars qw($VERSION);=head1 NAMETAP::Parser::Aggregator - Aggregate TAP::Parser results=head1 VERSIONVersion 3.07=cut$VERSION = '3.07';=head1 SYNOPSIS    use TAP::Parser::Aggregator;    my $aggregate = TAP::Parser::Aggregator->new;    $aggregate->add( 't/00-load.t', $load_parser );    $aggregate->add( 't/10-lex.t',  $lex_parser  );    my $summary = <<'END_SUMMARY';    Passed:  %s    Failed:  %s    Unexpectedly succeeded: %s    END_SUMMARY    printf $summary,           scalar $aggregate->passed,           scalar $aggregate->failed,           scalar $aggregate->todo_passed;=head1 DESCRIPTIONC<TAP::Parser::Aggregator> collects parser objects and allowsreporting/querying their aggregate results.=head1 METHODS=head2 Class Methods=head3 C<new> my $aggregate = TAP::Parser::Aggregator->new;Returns a new C<TAP::Parser::Aggregator> object.=cutmy %SUMMARY_METHOD_FOR;BEGIN {    # install summary methods    %SUMMARY_METHOD_FOR = map { $_ => $_ } qw(      failed      parse_errors      passed      skipped      todo      todo_passed      total      wait      exit    );    $SUMMARY_METHOD_FOR{total} = 'tests_run';    foreach my $method ( keys %SUMMARY_METHOD_FOR ) {        next if 'total' eq $method;        no strict 'refs';        *$method = sub {            my $self = shift;            return wantarray              ? @{ $self->{"descriptions_for_$method"} }              : $self->{$method};        };    }}    # end install summary methodssub new {    my ($class) = @_;    my $self = bless {}, $class;    $self->_initialize;    return $self;}sub _initialize {    my ($self) = @_;    $self->{parser_for}  = {};    $self->{parse_order} = [];    foreach my $summary ( keys %SUMMARY_METHOD_FOR ) {        $self->{$summary} = 0;        next if 'total' eq $summary;        $self->{"descriptions_for_$summary"} = [];    }    return $self;}##############################################################################=head2 Instance Methods=head3 C<add>  $aggregate->add( $description => $parser );The C<$description> is usually a test file name (but only byconvention.)  It is used as a unique identifier (see e.g.L<"parsers">.)  Reusing a description is a fatal error.The C<$parser> is a L<TAP::Parser|TAP::Parser> object.=cutsub add {    my ( $self, $description, $parser ) = @_;    if ( exists $self->{parser_for}{$description} ) {        $self->_croak( "You already have a parser for ($description)."              . " Perhaps you have run the same test twice." );    }    push @{ $self->{parse_order} } => $description;    $self->{parser_for}{$description} = $parser;    while ( my ( $summary, $method ) = each %SUMMARY_METHOD_FOR ) {        if ( my $count = $parser->$method() ) {            $self->{$summary} += $count;            push @{ $self->{"descriptions_for_$summary"} } => $description;        }    }    return $self;}##############################################################################=head3 C<parsers>  my $count   = $aggregate->parsers;  my @parsers = $aggregate->parsers;  my @parsers = $aggregate->parsers(@descriptions);In scalar context without arguments, this method returns the number of parsersaggregated.  In list context without arguments, returns the parsers in theorder they were added.If C<@descriptions> is given, these correspond to the keys used in eachcall to the add() method.  Returns an array of the requested parsers (inthe requested order) in list context or an array reference in scalarcontext.Requesting an unknown identifier is a fatal error.=cutsub parsers {    my $self = shift;    return $self->_get_parsers(@_) if @_;    my $descriptions = $self->{parse_order};    my @parsers      = @{ $self->{parser_for} }{@$descriptions};    # Note:  Because of the way context works, we must assign the parsers to    # the @parsers array or else this method does not work as documented.    return @parsers;}sub _get_parsers {    my ( $self, @descriptions ) = @_;    my @parsers;    foreach my $description (@descriptions) {        $self->_croak("A parser for ($description) could not be found")          unless exists $self->{parser_for}{$description};        push @parsers => $self->{parser_for}{$description};    }    return wantarray ? @parsers : \@parsers;}=head3 C<descriptions>Get an array of descriptions in the order in which they were added to the aggregator.=cutsub descriptions { @{ shift->{parse_order} || [] } }=head3 C<start>Call C<start> immediately before adding any results to the aggregator.Among other times it records the start time for the test run.=cutsub start {    my $self = shift;    $self->{start_time} = Benchmark->new;}=head3 C<stop>Call C<stop> immediately after adding all test results to the aggregator.=cutsub stop {    my $self = shift;    $self->{end_time} = Benchmark->new;}=head3 C<elapsed>Elapsed returns a L<Benchmark> object that represents the running timeof the aggregated tests. In order for C<elapsed> to be valid you mustcall C<start> before running the tests and C<stop> immediatelyafterwards.=cutsub elapsed {    my $self = shift;    require Carp;    Carp::croak      q{Can't call elapsed without first calling start and then stop}      unless defined $self->{start_time} && defined $self->{end_time};    return timediff( $self->{end_time}, $self->{start_time} );}=head3 C<elapsed_timestr>Returns a formatted string representing the runtime returned byC<elapsed()>.  This lets the caller not worry about Benchmark.=cutsub elapsed_timestr {    my $self = shift;    my $elapsed = $self->elapsed;    return timestr($elapsed);}=head3 C<all_passed>Return true if all the tests passed and no parse errors were detected.=cutsub all_passed {    my $self = shift;    return         $self->total      && $self->total == $self->passed      && !$self->has_errors;}=head3 C<get_status>Get a single word describing the status of the aggregated tests.Depending on the outcome of the tests returns 'PASS', 'FAIL' or'NOTESTS'. This token is understood by L<CPAN::Reporter>.=cutsub get_status {    my $self = shift;    my $total  = $self->total;    my $passed = $self->passed;    return        ( $self->has_errors || $total != $passed ) ? 'FAIL'      : $total ? 'PASS'      :          'NOTESTS';}##############################################################################=head2 Summary methodsEach of the following methods will return the total number of correspondingtests if called in scalar context.  If called in list context, returns thedescriptions of the parsers which contain the corresponding tests (see C<add>for an explanation of description.=over 4=item * failed=item * parse_errors=item * passed=item * skipped=item * todo=item * todo_passed=item * wait=item * exit=backFor example, to find out how many tests unexpectedly succeeded (TODO testswhich passed when they shouldn't): my $count        = $aggregate->todo_passed; my @descriptions = $aggregate->todo_passed;Note that C<wait> and C<exit> are the totals of the wait and exitstatuses of each of the tests. These values are totalled only to providea true value if any of them are non-zero.=cut##############################################################################=head3 C<total>  my $tests_run = $aggregate->total;Returns the total number of tests run.=cutsub total { shift->{total} }##############################################################################=head3 C<has_problems>  if ( $parser->has_problems ) {      ...  }Identical to C<has_errors>, but also returns true if any TODO testsunexpectedly succeeded.  This is more akin to "warnings".=cutsub has_problems {    my $self = shift;    return $self->todo_passed      || $self->has_errors;}##############################################################################=head3 C<has_errors>  if ( $parser->has_errors ) {      ...  }Returns true if I<any> of the parsers failed.  This includes:=over 4=item * Failed tests=item * Parse erros=item * Bad exit or wait status=back=cutsub has_errors {    my $self = shift;    return         $self->failed      || $self->parse_errors      || $self->exit      || $self->wait;}##############################################################################=head3 C<todo_failed>  # deprecated in favor of 'todo_passed'.  This method was horribly misnamed.This was a badly misnamed method.  It indicates which TODO tests unexpectedlysucceeded.  Will now issue a warning and call C<todo_passed>.=cutsub todo_failed {    warn      '"todo_failed" is deprecated.  Please use "todo_passed".  See the docs.';    goto &todo_passed;}sub _croak {    my $proto = shift;    require Carp;    Carp::croak(@_);}=head1 See AlsoL<TAP::Parser>L<TAP::Harness>=cut1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -