1package App::Prove::State::Result::Test; 2 3use strict; 4use warnings; 5 6=head1 NAME 7 8App::Prove::State::Result::Test - Individual test results. 9 10=head1 VERSION 11 12Version 3.48 13 14=cut 15 16our $VERSION = '3.48'; 17 18=head1 DESCRIPTION 19 20The C<prove> command supports a C<--state> option that instructs it to 21store persistent state across runs. This module encapsulates the results for a 22single test. 23 24=head1 SYNOPSIS 25 26 # Re-run failed tests 27 $ prove --state=failed,save -rbv 28 29=cut 30 31my %methods = ( 32 name => { method => 'name' }, 33 elapsed => { method => 'elapsed', default => 0 }, 34 gen => { method => 'generation', default => 1 }, 35 last_pass_time => { method => 'last_pass_time', default => undef }, 36 last_fail_time => { method => 'last_fail_time', default => undef }, 37 last_result => { method => 'result', default => 0 }, 38 last_run_time => { method => 'run_time', default => undef }, 39 last_todo => { method => 'num_todo', default => 0 }, 40 mtime => { method => 'mtime', default => undef }, 41 seq => { method => 'sequence', default => 1 }, 42 total_passes => { method => 'total_passes', default => 0 }, 43 total_failures => { method => 'total_failures', default => 0 }, 44 parser => { method => 'parser' }, 45); 46 47while ( my ( $key, $description ) = each %methods ) { 48 my $default = $description->{default}; 49 no strict 'refs'; 50 *{ $description->{method} } = sub { 51 my $self = shift; 52 if (@_) { 53 $self->{$key} = shift; 54 return $self; 55 } 56 return $self->{$key} || $default; 57 }; 58} 59 60=head1 METHODS 61 62=head2 Class Methods 63 64=head3 C<new> 65 66=cut 67 68sub new { 69 my ( $class, $arg_for ) = @_; 70 $arg_for ||= {}; 71 bless $arg_for => $class; 72} 73 74=head2 Instance Methods 75 76=head3 C<name> 77 78The name of the test. Usually a filename. 79 80=head3 C<elapsed> 81 82The total elapsed times the test took to run, in seconds from the epoch.. 83 84=head3 C<generation> 85 86The number for the "generation" of the test run. The first generation is 1 87(one) and subsequent generations are 2, 3, etc. 88 89=head3 C<last_pass_time> 90 91The last time the test program passed, in seconds from the epoch. 92 93Returns C<undef> if the program has never passed. 94 95=head3 C<last_fail_time> 96 97The last time the test suite failed, in seconds from the epoch. 98 99Returns C<undef> if the program has never failed. 100 101=head3 C<mtime> 102 103Returns the mtime of the test, in seconds from the epoch. 104 105=head3 C<raw> 106 107Returns a hashref of raw test data, suitable for serialization by YAML. 108 109=head3 C<result> 110 111Currently, whether or not the test suite passed with no 'problems' (such as 112TODO passed). 113 114=head3 C<run_time> 115 116The total time it took for the test to run, in seconds. If C<Time::HiRes> is 117available, it will have finer granularity. 118 119=head3 C<num_todo> 120 121The number of tests with TODO directives. 122 123=head3 C<sequence> 124 125The order in which this test was run for the given test suite result. 126 127=head3 C<total_passes> 128 129The number of times the test has passed. 130 131=head3 C<total_failures> 132 133The number of times the test has failed. 134 135=head3 C<parser> 136 137The underlying parser object. This is useful if you need the full 138information for the test program. 139 140=cut 141 142sub raw { 143 my $self = shift; 144 my %raw = %$self; 145 146 # this is backwards-compatibility hack and is not guaranteed. 147 delete $raw{name}; 148 delete $raw{parser}; 149 return \%raw; 150} 151 1521; 153