The following commit has been merged in the master branch:
commit 0baef9061f7736f6179446d9f1f8e372ce98515b
Author: Guillem Jover <[email protected]>
Date:   Sun Jan 6 03:04:22 2013 +0100

    test: Add new perl critic test case
    
    Mark false positives in the perl code so that perlcritic ignores them,
    and so that they are documented in-place.

diff --git a/Makefile.am b/Makefile.am
index ab7825d..4e1602f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -131,9 +131,11 @@ endif
 
 test_cases = \
        test/000_pod.t \
+       test/100_critic.t \
        $(nil)
 
 test_data = \
+       test/100_critic/perlcriticrc \
        $(nil)
 
 include $(top_srcdir)/Makecheck.am
diff --git a/README b/README
index 087e875..1b9ab8d 100644
--- a/README
+++ b/README
@@ -78,6 +78,10 @@ To run the test suite («make check»):
   TimeDate perl module
   IO-String perl module
 
+  Define the environment variable DPKG_DEVEL_MODE to run the test suite
+  in development mode, to include tests that might not be pertinent during
+  normal release builds.
+
 To enable additional developer's documentation («make doc») this software
 will be needed:
 
diff --git a/dselect/mkcurkeys.pl b/dselect/mkcurkeys.pl
index 5a2b2c4..369c6cc 100755
--- a/dselect/mkcurkeys.pl
+++ b/dselect/mkcurkeys.pl
@@ -85,12 +85,14 @@ for (my $i = 33; $i <= 126; $i++) {
     p();
 }
 
+## no critic (BuiltinFunctions::ProhibitReverseSortBlock)
 for $k (sort {
     looks_like_number($a) ?
         looks_like_number($b) ? $a <=> $b : -1
             : looks_like_number($b) ? 1 :
                 $a cmp $b
                 } keys %base) {
+    ## use critic
     $v= $base{$k};
     $v= $name{$k} if defined($name{$k});
     $v= $over{$k} if defined($over{$k});
diff --git a/scripts/Dpkg/Source/Package.pm b/scripts/Dpkg/Source/Package.pm
index 041c470..e5c6ab9 100644
--- a/scripts/Dpkg/Source/Package.pm
+++ b/scripts/Dpkg/Source/Package.pm
@@ -71,7 +71,7 @@ our $diff_ignore_default_regexp = '
 # Take out comments and newlines
 $diff_ignore_default_regexp =~ s/^#.*$//mg;
 $diff_ignore_default_regexp =~ s/\n//sg;
-no warnings 'qw';
+no warnings 'qw'; ## no critic (TestingAndDebugging::ProhibitNoWarnings)
 our @tar_ignore_default_pattern = qw(
 *.a
 *.la
diff --git a/scripts/t/300_Dpkg_BuildOptions.t 
b/scripts/t/300_Dpkg_BuildOptions.t
index 084333d..5892f18 100644
--- a/scripts/t/300_Dpkg_BuildOptions.t
+++ b/scripts/t/300_Dpkg_BuildOptions.t
@@ -22,7 +22,7 @@ use warnings;
 use_ok('Dpkg::BuildOptions');
 
 {
-    no warnings;
+    no warnings; ## no critic (TestingAndDebugging::ProhibitNoWarnings)
     # Disable warnings related to invalid values fed during
     # the tests
     report_options(quiet_warnings => 1);
diff --git a/scripts/t/600_Dpkg_Changelog.t b/scripts/t/600_Dpkg_Changelog.t
index 37d0574..030de41 100644
--- a/scripts/t/600_Dpkg_Changelog.t
+++ b/scripts/t/600_Dpkg_Changelog.t
@@ -166,10 +166,12 @@ foreach my $file ("$datadir/countme", "$datadir/shadow", 
"$datadir/fields",
                       { to => '1:2.0~rc2-1sarge2' }, 3,
                       '1:2.0~rc2-1sarge2/1:2.0~rc2-1sarge1/1.5-1',
                       'to => "1:2.0~rc2-1sarge2"' );
+       ## no critic (ControlStructures::ProhibitUntilBlocks)
        check_options( $changes, \@data,
                       { until => '1:2.0~rc2-1sarge2' }, 2,
                       '1:2.0~rc2-1sarge1/1.5-1',
                       'until => "1:2.0~rc2-1sarge2"' );
+       ## use critic
        #TODO: test combinations
     }
     if ($file eq "$datadir/fields") {
diff --git a/test/100_critic.t b/test/100_critic.t
new file mode 100644
index 0000000..eac78ca
--- /dev/null
+++ b/test/100_critic.t
@@ -0,0 +1,91 @@
+#!/usr/bin/perl
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+
+unless (defined $ENV{DPKG_DEVEL_MODE}) {
+    plan skip_all => 'not running in development mode';
+}
+
+if (defined $ENV{srcdir}) {
+    chdir $ENV{srcdir} or die "cannot chdir to source directory: $!";
+}
+
+if (not eval { require Test::Perl::Critic }) {
+    plan skip_all => 'Test::Perl::Critic required to criticize code';
+}
+if (not eval { require Perl::Critic::Utils }) {
+    plan skik_all => 'Perl::Critic::Utils required to criticize code';
+}
+
+my @policies = qw(
+    BuiltinFunctions::ProhibitLvalueSubstr
+    BuiltinFunctions::ProhibitReverseSortBlock
+    BuiltinFunctions::ProhibitSleepViaSelect
+    BuiltinFunctions::ProhibitUniversalCan
+    BuiltinFunctions::ProhibitUniversalIsa
+    BuiltinFunctions::RequireSimpleSortBlock
+    ClassHierarchies::ProhibitAutoloading
+    ClassHierarchies::ProhibitExplicitISA
+    ClassHierarchies::ProhibitOneArgBless
+    CodeLayout::RequireConsistentNewlines
+    ControlStructures::ProhibitLabelsWithSpecialBlockNames
+    ControlStructures::ProhibitUntilBlocks
+    Documentation::RequirePackageMatchesPodName
+    InputOutput::ProhibitInteractiveTest
+    InputOutput::ProhibitOneArgSelect
+    InputOutput::RequireEncodingWithUTF8Layer
+    Miscellanea::ProhibitFormats
+    Miscellanea::ProhibitUnrestrictedNoCritic
+    Miscellanea::ProhibitUselessNoCritic
+    Modules::ProhibitEvilModules
+    Modules::RequireBarewordIncludes
+    Modules::RequireEndWithOne
+    Modules::RequireExplicitPackage
+    Modules::RequireFilenameMatchesPackage
+    TestingAndDebugging::ProhibitNoStrict
+    TestingAndDebugging::ProhibitNoWarnings
+    ValuesAndExpressions::ProhibitComplexVersion
+    ValuesAndExpressions::ProhibitLongChainsOfMethodCalls
+    ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters
+    ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator
+    ValuesAndExpressions::ProhibitVersionStrings
+    ValuesAndExpressions::RequireConstantVersion
+    ValuesAndExpressions::RequireUpperCaseHeredocTerminator
+    Variables::ProhibitAugmentedAssignmentInDeclaration
+    Variables::ProhibitPerl4PackageNames
+    Variables::ProtectPrivateVars
+    Variables::RequireNegativeIndices
+);
+
+Test::Perl::Critic->import(
+    -profile => 'test/100_critic/perlcriticrc',
+    -verbose => 8,
+    -include => \@policies,
+    -only => 1,
+);
+
+my @dirs = qw(test src/t utils/t scripts/t dselect scripts/Dpkg);
+my @files = glob 'scripts/Dpkg.pm scripts/*.pl scripts/changelog/*.pl';
+push @files, Perl::Critic::Utils::all_perl_files(@dirs);
+
+plan tests => scalar @files;
+
+for my $file (@files) {
+    critic_ok($file);
+}
diff --git a/test/100_critic/perlcriticrc b/test/100_critic/perlcriticrc
new file mode 100644
index 0000000..486bcf0
--- /dev/null
+++ b/test/100_critic/perlcriticrc
@@ -0,0 +1,69 @@
+# Perl Critic configuration file
+severity = 1
+verbose = %f %l:%c (Severity: %s)\n  %P (%s)\n  near '%r'\n%d\n
+
+#[RegularExpressions::RequireExtendedFormatting]
+#minimum_regex_length_to_complain_about = 60
+
+# Complex is not always bad.
+[-BuiltinFunctions::ProhibitComplexMappings]
+# Needed when generating code.
+[-BuiltinFunctions::ProhibitStringyEval]
+# FIXME: Bogus check.
+[-Documentation::PodSpelling]
+# While this might be good for performance, it is bad for keeping docs updated.
+[-Documentation::RequirePodAtEnd]
+# FIXME: Bogus check.
+[-Documentation::RequirePodLinksIncludeText]
+# TODO: Standardize sections, but the ones from this are not usable.
+[-Documentation::RequirePodSections]
+# Too many false positives.
+[-CodeLayout::RequireTidyCode]
+# Forcing this just turns into noise (depending on the context, it makes 
sense).
+[-CodeLayout::RequireTrailingCommas]
+# These are fine.
+[-ControlStructures::ProhibitCascadingIfElse]
+# These are fine, too many in the code base anyway.
+[-ControlStructures::ProhibitPostfixControls]
+# These are fine, usually as long as they are not double negations.
+[-ControlStructures::ProhibitUnlessBlocks]
+# FIXME: Too many false positives.
+[-ControlStructures::ProhibitUnreachableCode]
+# TODO: Check it out, add new Dpkg::Program module?
+[-InputOutput::ProhibitBacktickOperators]
+# Needed, using <>/<@ARGV> is not correct, Prompt is not a core module.
+[-InputOutput::ProhibitExplicitStdin]
+# TODO: Maybe, some of these are part of the public/current API.
+[-Modules::ProhibitAutomaticExportation]
+# Complex is not always bad.
+[-Modules::ProhibitExcessMainComplexity]
+# FIXME: Too many false positives; non-modules all trigger.
+[-Modules::RequireVersionVar]
+# These are fine.
+[-NamingConventions::ProhibitAmbiguousNames]
+# When . is used in the code it means what it does.
+[-RegularExpressions::RequireDotMatchAnything]
+# When ^ or $ are used in the code they mean what they do.
+[-RegularExpressions::RequireLineBoundaryMatching]
+# TODO: While valid, these are part of the public/current API.
+[-Subroutines::ProhibitBuiltinHomonyms]
+# Needed.
+[-Subroutines::ProhibitSubroutinePrototypes]
+# Adding these seems like more noise.
+[-Subroutines::RequireFinalReturn]
+# Readers need to know perl, English module is worse.
+[-Variables::ProhibitPunctuationVars]
+# Readers need to know perl.
+[-Variables::RequireInitializationForLocalVars]
+# FIXME: Too many false positives; on ::main and for $ENV, $SIG, $?, $a, $b.
+[-Variables::RequireLocalizedPunctuationVars]
+# Readonly is not a core module.
+[-ValuesAndExpressions::ProhibitConstantPragma]
+# TODO: Check it out, using other quotes might be less readable and uniform.
+[-ValuesAndExpressions::ProhibitEmptyQuotes]
+# Used for help output.
+[-ValuesAndExpressions::ProhibitImplicitNewlines]
+# Octals are fine.
+[-ValuesAndExpressions::ProhibitLeadingZeros]
+# TODO: Check it out, some magic numbers are fine, octals for example.
+[-ValuesAndExpressions::ProhibitMagicNumbers]

-- 
dpkg's main repository


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to