Login
8e6875e2aed00aa7d1a81ec6a2ddca0f5143145c
[gknop/Perl-Critic.git] / xt / author / 80_policysummary.t
1 #!perl
2
3 ##############################################################################
4 #      $URL$
5 #     $Date$
6 #   $Author$
7 # $Revision$
8 ##############################################################################
9
10 use strict;
11 use warnings;
12
13 use English qw< -no_match_vars >;
14 use Carp qw< confess >;
15
16 use File::Spec;
17 use List::MoreUtils qw(any);
18
19 use Perl::Critic::PolicyFactory ( -test => 1 );
20 use Perl::Critic::TestUtils qw{ bundled_policy_names };
21
22 use Test::More;
23
24 #-----------------------------------------------------------------------------
25
26 our $VERSION = '1.088';
27
28 #-----------------------------------------------------------------------------
29
30 my $summary_file =
31     File::Spec->catfile( qw< lib Perl Critic PolicySummary.pod > );
32 if (open my ($fh), '<', $summary_file) {
33
34     my $content = do {local $/=undef; <$fh> };
35     close $fh or confess "Couldn't close $summary_file: $OS_ERROR";
36
37     my @policy_names = bundled_policy_names();
38     my @summaries    = $content =~ m/^=head2 [ ]+ L<([\w:]+)>/gxms;
39     plan( tests => 2 + 2 * @policy_names );
40
41     my %num_summaries;
42     for my $summary (@summaries) {
43         ++$num_summaries{$summary};
44     }
45     if (!ok(@summaries == keys %num_summaries, 'right number of summaries')) {
46         for my $policy_name (sort keys %num_summaries) {
47             next if 1 == $num_summaries{$policy_name};
48             diag('Duplicate summary for ' . $policy_name);
49         }
50     }
51
52     my $profile = Perl::Critic::UserProfile->new();
53     my $factory = Perl::Critic::PolicyFactory->new( -profile => $profile );
54     my %found_policies = map { ref $_ => $_ } $factory->create_all_policies();
55
56     my %descriptions = $content =~ m/^=head2 [ ]+ L<([\w:]+)>\n\n([^\n]+)/gxms;
57     for my $policy_name (keys %descriptions) {
58         my $severity;
59         if (
60             $descriptions{$policy_name} =~ s/ [ ] \[ Severity [ ] (\d+) \] //xms
61         ) {
62             $severity = $1;
63         }
64         else {
65             $severity = '<unknown>';
66         }
67
68         $descriptions{$policy_name} = {
69             desc => $descriptions{$policy_name},
70             severity => $severity,
71         };
72     }
73
74     for my $policy_name ( @policy_names ) {
75         my $label = qq{PolicySummary.pod has "$policy_name"};
76         my $has_summary = delete $num_summaries{$policy_name};
77         is( $has_summary, 1, $label );
78
79         my $summary_severity = $descriptions{$policy_name}->{severity};
80         my $real_severity = $found_policies{$policy_name} &&
81           $found_policies{$policy_name}->default_severity;
82         is( $summary_severity, $real_severity, "severity for $policy_name" );
83     }
84
85     if (!ok(0 == keys %num_summaries, 'no extra summaries')) {
86         for my $policy_name (sort keys %num_summaries) {
87             diag('Extraneous summary for ' . $policy_name);
88         }
89     }
90 }
91 else {
92     plan 'no_plan';
93     fail qq<Cannot open "$summary_file": $ERRNO>;
94 }
95
96 #-----------------------------------------------------------------------------
97
98 # ensure we run true if this test is loaded by
99 # t/80_policysummary.t.without_optional_dependencies.t
100 1;
101
102 # Local Variables:
103 #   mode: cperl
104 #   cperl-indent-level: 4
105 #   fill-column: 78
106 #   indent-tabs-mode: nil
107 #   c-indentation-style: bsd
108 # End:
109 # ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :