henforcer-1.0.0.0: test/Test/Config/Documentation.hs
{-# LANGUAGE OverloadedStrings #-}
module Test.Config.Documentation
( checkDocumentation
) where
import qualified Hedgehog as HH
import qualified Test.Tasty as Tasty
import qualified Test.Tasty.Hedgehog as TastyHH
import qualified CompatGHC
import qualified Henforcer.Checks as Checks
import qualified Henforcer.Config as Config
import qualified Henforcer.Rules as Rules
singleProperty :: Tasty.TestName -> HH.PropertyT IO () -> Tasty.TestTree
singleProperty name =
TastyHH.testProperty name . HH.withTests 1 . HH.property
checkDocumentation :: Config.Config -> Tasty.TestTree
checkDocumentation conf =
Tasty.testGroup
"Checking configuration parsing of documentation rules"
[ checkAnyModule conf
, checkPatternModule conf
, checkPatternModulePicksFirst conf
, checkSpecifiedModule conf
, checkPatternModuleIgnores conf
]
checkAnyModule :: Config.Config -> Tasty.TestTree
checkAnyModule conf =
singleProperty "Does folding correctly for any module section" $
documentationAnyModuleRules
HH.=== Checks.determineDocumentationChecks conf (CompatGHC.mkModuleName "AnyModule")
checkPatternModule :: Config.Config -> Tasty.TestTree
checkPatternModule conf =
singleProperty "Picks pattern module section when module matches" $
documentationPatternModuleRules
HH.=== Checks.determineDocumentationChecks conf (CompatGHC.mkModuleName "Pattern.Module")
checkPatternModulePicksFirst :: Config.Config -> Tasty.TestTree
checkPatternModulePicksFirst conf =
singleProperty "Overlapping patterns pick the first match" $
documentationPatternModuleRules
HH.=== Checks.determineDocumentationChecks conf (CompatGHC.mkModuleName "Pattern2.Module")
checkSpecifiedModule :: Config.Config -> Tasty.TestTree
checkSpecifiedModule conf =
singleProperty "Specified module is picked even if the pattern is matched" $
documentationSpecifiedModuleRules
HH.=== Checks.determineDocumentationChecks
conf
(CompatGHC.mkModuleName "PatternMatchedButSpecifiedWins.Module")
checkPatternModuleIgnores :: Config.Config -> Tasty.TestTree
checkPatternModuleIgnores conf =
singleProperty "Pattern module can ignore rules " $
documentationPatternWithIgnoresModuleRules
HH.=== Checks.determineDocumentationChecks conf (CompatGHC.mkModuleName "WithIgnoresPattern.Module")
documentationAnyModuleRules :: Checks.DocumentationChecks
documentationAnyModuleRules =
Checks.DocumentationChecks
{ Checks.maximumUndocumentedExports = Rules.Enforced 3
, Checks.minimumDocumentedExports = Rules.Enforced 3
, Checks.maximumExportsWithoutSince = Rules.Enforced 3
, Checks.minimumExportsWithSince = Rules.Enforced 3
, Checks.moduleHeaderCopyrightMustExistNonEmpty = Rules.Enforced True
, Checks.moduleHeaderDescriptionMustExistNonEmpty = Rules.Enforced True
, Checks.moduleHeaderLicenseMustExistNonEmpty = Rules.Enforced True
, Checks.moduleHeaderMaintainerMustExistNonEmpty = Rules.Enforced True
}
documentationPatternModuleRules :: Checks.DocumentationChecks
documentationPatternModuleRules =
Checks.DocumentationChecks
{ Checks.maximumUndocumentedExports = Rules.Enforced 2
, Checks.minimumDocumentedExports = Rules.Enforced 2
, Checks.maximumExportsWithoutSince = Rules.Enforced 2
, Checks.minimumExportsWithSince = Rules.Enforced 2
, Checks.moduleHeaderCopyrightMustExistNonEmpty = Rules.Enforced False
, Checks.moduleHeaderDescriptionMustExistNonEmpty = Rules.Enforced False
, Checks.moduleHeaderLicenseMustExistNonEmpty = Rules.Enforced False
, Checks.moduleHeaderMaintainerMustExistNonEmpty = Rules.Enforced False
}
documentationPatternWithIgnoresModuleRules :: Checks.DocumentationChecks
documentationPatternWithIgnoresModuleRules =
Checks.DocumentationChecks
{ Checks.maximumUndocumentedExports = Rules.NotEnforced
, Checks.minimumDocumentedExports = Rules.NotEnforced
, Checks.maximumExportsWithoutSince = Rules.NotEnforced
, Checks.minimumExportsWithSince = Rules.NotEnforced
, Checks.moduleHeaderCopyrightMustExistNonEmpty = Rules.NotEnforced
, Checks.moduleHeaderDescriptionMustExistNonEmpty = Rules.NotEnforced
, Checks.moduleHeaderLicenseMustExistNonEmpty = Rules.NotEnforced
, Checks.moduleHeaderMaintainerMustExistNonEmpty = Rules.NotEnforced
}
documentationSpecifiedModuleRules :: Checks.DocumentationChecks
documentationSpecifiedModuleRules =
Checks.DocumentationChecks
{ Checks.maximumUndocumentedExports = Rules.Enforced 20
, Checks.minimumDocumentedExports = Rules.Enforced 20
, Checks.maximumExportsWithoutSince = Rules.Enforced 20
, Checks.minimumExportsWithSince = Rules.Enforced 20
, Checks.moduleHeaderCopyrightMustExistNonEmpty = Rules.Enforced True
, Checks.moduleHeaderDescriptionMustExistNonEmpty = Rules.Enforced True
, Checks.moduleHeaderLicenseMustExistNonEmpty = Rules.Enforced True
, Checks.moduleHeaderMaintainerMustExistNonEmpty = Rules.Enforced True
}