File Coverage

blib/lib/Test/CPAN/Changes.pm
Criterion Covered Total %
statement 64 72 88.8
branch 20 24 83.3
condition 7 13 53.8
subroutine 10 11 90.9
pod 2 2 100.0
total 103 122 84.4


line stmt bran cond sub pod time code
1             package Test::CPAN::Changes;
2 1     1   129372 use strict;
  1         2  
  1         42  
3 1     1   6 use warnings;
  1         2  
  1         68  
4              
5 1     1   570 use CPAN::Changes::Parser;
  1         5  
  1         53  
6 1     1   10 use Test::Builder;
  1         2  
  1         27  
7 1     1   552 use version ();
  1         2339  
  1         74  
8              
9             our $VERSION = '0.500005';
10             $VERSION =~ tr/_//d;
11              
12 1     1   8 use Exporter; BEGIN { *import = \&Exporter::import };
  1     1   1  
  1         77  
  1         236  
13              
14             our @EXPORT = qw(changes_ok changes_file_ok);
15              
16             our $Test = Test::Builder->new;
17             our $Parser = CPAN::Changes::Parser->new(
18             _release_class => 'Test::CPAN::Changes::Release',
19             );
20              
21             sub changes_ok {
22 0     0 1 0 local $Test::Builder::Level = $Test::Builder::Level + 1;
23 0         0 my ($arg) = @_;
24 0 0 0     0 $Test->plan( tests => ( $arg && defined $arg->{version} ? 6 : 4 ) );
25 0         0 return changes_file_ok( undef, @_ );
26             }
27              
28             {
29             package
30             Test::CPAN::Changes::Release;
31 1     1   10 use Moo;
  1         2  
  1         9  
32             extends 'CPAN::Changes::Release';
33             has raw_date => (is => 'ro');
34             }
35              
36             sub changes_file_ok {
37 8     8 1 552 my ( $file, $arg ) = @_;
38 8   50     28 $file ||= 'Changes';
39 8   100     41 $arg ||= {};
40              
41 8         46 local $Test::Builder::Level = $Test::Builder::Level + 1;
42              
43 8 100       27 my $tests = defined $arg->{version} ? 6 : 4;
44 8         18 my $ok = 1;
45              
46 8         12 my $changes;
47              
48             $Test->ok(
49 8         32 !!eval { $changes = $Parser->parse_file( $file ); 1 },
  8         5094  
50             "$file is loadable"
51 8 50       16 ) or do {
52 0         0 $Test->diag("Error: $@");
53 0         0 $Test->skip("can't test unparsable change log") for 2 .. $tests;
54 0         0 return !1;
55             };
56              
57             my @releases =
58             map $_->[0],
59 8         178 sort { $a->[1] <=> $b->[1] }
  0         0  
60             map [$_, $_->line],
61             $changes->releases;
62              
63 8 100       142 $Test->ok( !!@releases, "$file contains at least one release" ) or $ok = 0;
64              
65 8         117 my $date_err;
66 8         20 for my $release ( @releases ) {
67 7 100 66     53 if ( !defined $release->date || $release->date eq '' ) {
68 1         8 $date_err = 'No date for version '.$release->version.' (line '.$release->line.')';
69 1         3 last;
70             }
71              
72 6         17 my $d = $release->raw_date;
73 6 50 66     349 if (
74             $d !~ m{^${CPAN::Changes::Parser::_ISO_8601_DATE}$}
75             && $d !~ m{^(${CPAN::Changes::Parser::_UNKNOWN_DATE})$}
76             ) {
77 1         29 $Test->note( 'Date "' . $d . '" is not in the recommended W3CDTF format, should be "'.$release->date.'" (line '.$release->line.')' );
78             }
79             }
80 8 100       65 $Test->ok( !defined $date_err, "$file contains all valid release dates" )
81             or $Test->diag(' ERR: '.$date_err), $ok = 0;
82              
83 8         138 my $version_err;
84 8         17 for my $release ( @releases ) {
85             # strip off -TRIAL before testing
86 7         30 (my $version = $release->version) =~ s/-TRIAL$//;
87 7         14 my $parsed = eval {
88 1     1   1041 use warnings FATAL => 'all';
  1         2  
  1         371  
89 7         76 version->new($version);
90             };
91 7 100       35 if ( !defined $parsed ) {
92 1         8 $version_err = $release->version . ' (line '.$release->line.')';
93 1         4 last;
94             }
95             }
96 8 100       61 $Test->ok( !defined $version_err, "$file contains all valid release versions" )
97             or $Test->diag(' ERR: '.$version_err), $ok = 0;
98              
99 8 100       138 if ( defined $arg->{version} ) {
100 3         8 my $v = $arg->{version};
101              
102 3         13 my $release = $changes->release( $v );
103 3 100       29 if ($Test->ok( !!$release, "$file has an entry for version $v" )) {
104 2         84 my $entries = $release->entries;
105 2 100       29 $Test->ok( !!@$entries, "$file version $v has content")
106             or $ok = 0;
107             }
108             else {
109 1         26 $Test->skip("can't check for entries in nonexistant version");
110 1         15 $ok = 0;
111             };
112             }
113 8         98 return !!$ok;
114             }
115              
116             1;
117              
118             __END__