summaryrefslogtreecommitdiffstats
path: root/t/critic
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--t/critic.t131
-rw-r--r--t/critic/perlcriticrc129
2 files changed, 260 insertions, 0 deletions
diff --git a/t/critic.t b/t/critic.t
new file mode 100644
index 0000000..acb841f
--- /dev/null
+++ b/t/critic.t
@@ -0,0 +1,131 @@
+#!/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 <https://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+
+use Test::More;
+use Test::Dpkg qw(:needs);
+
+test_needs_author();
+test_needs_module('Test::Perl::Critic');
+test_needs_srcdir_switch();
+
+my @policies = qw(
+ BuiltinFunctions::ProhibitBooleanGrep
+ BuiltinFunctions::ProhibitLvalueSubstr
+ BuiltinFunctions::ProhibitReverseSortBlock
+ BuiltinFunctions::ProhibitSleepViaSelect
+ BuiltinFunctions::ProhibitStringySplit
+ BuiltinFunctions::ProhibitUniversalCan
+ BuiltinFunctions::ProhibitUniversalIsa
+ BuiltinFunctions::ProhibitUselessTopic
+ BuiltinFunctions::ProhibitVoidGrep
+ BuiltinFunctions::ProhibitVoidMap
+ BuiltinFunctions::RequireBlockGrep
+ BuiltinFunctions::RequireBlockMap
+ BuiltinFunctions::RequireGlobFunction
+ BuiltinFunctions::RequireSimpleSortBlock
+ ClassHierarchies::ProhibitAutoloading
+ ClassHierarchies::ProhibitExplicitISA
+ ClassHierarchies::ProhibitOneArgBless
+ CodeLayout::ProhibitHardTabs
+ CodeLayout::ProhibitQuotedWordLists
+ CodeLayout::ProhibitTrailingWhitespace
+ CodeLayout::RequireConsistentNewlines
+ ControlStructures::ProhibitCStyleForLoops
+ ControlStructures::ProhibitLabelsWithSpecialBlockNames
+ ControlStructures::ProhibitMutatingListFunctions
+ ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions
+ ControlStructures::ProhibitUntilBlocks
+ Documentation::RequirePackageMatchesPodName
+ Documentation::RequirePodSections
+ InputOutput::ProhibitBarewordFileHandles
+ InputOutput::ProhibitInteractiveTest
+ InputOutput::ProhibitJoinedReadline
+ InputOutput::ProhibitOneArgSelect
+ InputOutput::ProhibitReadlineInForLoop
+ InputOutput::ProhibitTwoArgOpen
+ InputOutput::RequireBracedFileHandleWithPrint
+ InputOutput::RequireCheckedOpen
+ InputOutput::RequireEncodingWithUTF8Layer
+ Miscellanea::ProhibitFormats
+ Miscellanea::ProhibitTies
+ Miscellanea::ProhibitUnrestrictedNoCritic
+ Miscellanea::ProhibitUselessNoCritic
+ Modules::ProhibitConditionalUseStatements
+ Modules::ProhibitEvilModules
+ Modules::RequireBarewordIncludes
+ Modules::RequireEndWithOne
+ Modules::RequireExplicitPackage
+ Modules::RequireFilenameMatchesPackage
+ NamingConventions::Capitalization
+ Objects::ProhibitIndirectSyntax
+ RegularExpressions::ProhibitSingleCharAlternation
+ RegularExpressions::ProhibitUnusedCapture
+ RegularExpressions::ProhibitUnusualDelimiters
+ RegularExpressions::ProhibitUselessTopic
+ RegularExpressions::RequireBracesForMultiline
+ RegularExpressions::RequireExtendedFormatting
+ Subroutines::ProhibitAmpersandSigils
+ Subroutines::ProhibitExplicitReturnUndef
+ Subroutines::ProhibitManyArgs
+ Subroutines::ProhibitNestedSubs
+ Subroutines::ProhibitReturnSort
+ Subroutines::ProhibitUnusedPrivateSubroutines
+ Subroutines::ProtectPrivateSubs
+ TestingAndDebugging::ProhibitNoStrict
+ TestingAndDebugging::ProhibitNoWarnings
+ TestingAndDebugging::RequireTestLabels
+ TestingAndDebugging::RequireUseStrict
+ TestingAndDebugging::RequireUseWarnings
+ ValuesAndExpressions::ProhibitCommaSeparatedStatements
+ ValuesAndExpressions::ProhibitComplexVersion
+ ValuesAndExpressions::ProhibitInterpolationOfLiterals
+ ValuesAndExpressions::ProhibitLongChainsOfMethodCalls
+ ValuesAndExpressions::ProhibitMismatchedOperators
+ ValuesAndExpressions::ProhibitMixedBooleanOperators
+ ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters
+ ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator
+ ValuesAndExpressions::ProhibitVersionStrings
+ ValuesAndExpressions::RequireConstantVersion
+ ValuesAndExpressions::RequireQuotedHeredocTerminator
+ ValuesAndExpressions::RequireUpperCaseHeredocTerminator
+ Variables::ProhibitAugmentedAssignmentInDeclaration
+ Variables::ProhibitConditionalDeclarations
+ Variables::ProhibitLocalVars
+ Variables::ProhibitMatchVars
+ Variables::ProhibitPackageVars
+ Variables::ProhibitPerl4PackageNames
+ Variables::ProhibitUnusedVariables
+ Variables::ProtectPrivateVars
+ Variables::RequireLexicalLoopIterators
+ Variables::RequireNegativeIndices
+);
+
+Test::Perl::Critic->import(
+ -profile => 't/critic/perlcriticrc',
+ -verbose => 8,
+ -include => \@policies,
+ -only => 1,
+);
+
+my @files = Test::Dpkg::all_perl_files();
+
+plan tests => scalar @files;
+
+for my $file (@files) {
+ critic_ok($file);
+}
diff --git a/t/critic/perlcriticrc b/t/critic/perlcriticrc
new file mode 100644
index 0000000..990462f
--- /dev/null
+++ b/t/critic/perlcriticrc
@@ -0,0 +1,129 @@
+## Perl Critic configuration file
+severity = 1
+verbose = %f %l:%c (Severity: %s)\n %P (%s)\n near '%r'\n%d\n
+program-extensions = .pl .t
+
+##
+## Tune tests
+##
+
+[Documentation::RequirePodSections]
+lib_sections = NAME | DESCRIPTION | CHANGES
+script_sections = NAME | SYNOPSIS | DESCRIPTION
+
+[RegularExpressions::ProhibitUnusualDelimiters]
+allow_all_brackets = 1
+
+[RegularExpressions::RequireBracesForMultiline]
+allow_all_brackets = 1
+
+[RegularExpressions::RequireExtendedFormatting]
+minimum_regex_length_to_complain_about = 60
+
+[ValuesAndExpressions::ProhibitInterpolationOfLiterals]
+# TODO: switch these to q{} ?
+allow_if_string_contains_single_quote = 1
+
+##
+## Disable tests
+##
+
+# Here complex is meant as long, but long is not necessarily complex.
+[-BuiltinFunctions::ProhibitComplexMappings]
+
+# Needed when generating code.
+[-BuiltinFunctions::ProhibitStringyEval]
+
+# BUG: Bogus check.
+[-Documentation::PodSpelling]
+
+# While this might be good for performance, it is bad for keeping docs updated.
+[-Documentation::RequirePodAtEnd]
+
+# BUG: Bogus check.
+[-Documentation::RequirePodLinksIncludeText]
+
+# 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]
+
+# BUG: 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]
+
+# Here complex is meant as long, but long is not necessarily complex.
+[-Modules::ProhibitExcessMainComplexity]
+
+# BUG: Too many false positives; non-modules all trigger.
+[-Modules::RequireVersionVar]
+
+# These are fine.
+[-NamingConventions::ProhibitAmbiguousNames]
+
+# We work primarily with ASCII, so we need to specify the exact characters
+# to match.
+[-RegularExpressions::ProhibitEnumeratedClasses]
+
+# 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]
+
+# BUG: 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]
+
+# Using charnames is less clear.
+[-ValuesAndExpressions::ProhibitEscapedCharacters]
+
+# 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]
+
+# BUG: False positives on long hex numbers, even when separated.
+[-ValuesAndExpressions::RequireNumberSeparators]