hackport-0.6.6: cabal/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- simplifier goes nuts otherwise
#if __GLASGOW_HASKELL__ < 806
{-# OPTIONS_GHC -funfolding-use-threshold=30 #-}
#endif
module UnitTests.Distribution.Client.ProjectConfig (tests) where
#if !MIN_VERSION_base(4,8,0)
import Data.Monoid
import Control.Applicative
#endif
import Data.Map (Map)
import qualified Data.Map as Map
import Data.List
import Network.URI (URI)
import Distribution.Deprecated.ParseUtils
import qualified Distribution.Deprecated.ReadP as Parse
import Distribution.Package
import Distribution.PackageDescription
import Distribution.Compiler
import Distribution.Version
import Distribution.Simple.Program.Types
import Distribution.Simple.Program.Db
import Distribution.Types.PackageVersionConstraint
import Distribution.Parsec
import Distribution.Pretty
import Distribution.Client.Types
import Distribution.Client.CmdInstall.ClientInstallFlags
import Distribution.Client.Dependency.Types
import Distribution.Client.Targets
import Distribution.Client.Types.SourceRepo
import Distribution.Utils.NubList
import Distribution.Solver.Types.PackageConstraint
import Distribution.Solver.Types.ConstraintSource
import Distribution.Solver.Types.Settings
import Distribution.Client.ProjectConfig
import Distribution.Client.ProjectConfig.Legacy
import UnitTests.Distribution.Client.ArbitraryInstances
import UnitTests.Distribution.Client.TreeDiffInstances ()
import Data.TreeDiff.Class
import Data.TreeDiff.QuickCheck
import Test.Tasty
import Test.Tasty.QuickCheck
tests :: [TestTree]
tests =
[ testGroup "ProjectConfig <-> LegacyProjectConfig round trip" $
[ testProperty "packages" prop_roundtrip_legacytypes_packages
, testProperty "buildonly" prop_roundtrip_legacytypes_buildonly
, testProperty "specific" prop_roundtrip_legacytypes_specific
] ++
-- a couple tests seem to trigger a RTS fault in ghc-7.6 and older
-- unclear why as of yet
concat
[ [ testProperty "shared" prop_roundtrip_legacytypes_shared
, testProperty "local" prop_roundtrip_legacytypes_local
, testProperty "all" prop_roundtrip_legacytypes_all
]
| not usingGhc76orOlder
]
, testGroup "individual parser tests"
[ testProperty "package location" prop_parsePackageLocationTokenQ
, testProperty "RelaxedDep" prop_roundtrip_printparse_RelaxedDep
, testProperty "RelaxDeps" prop_roundtrip_printparse_RelaxDeps
, testProperty "RelaxDeps'" prop_roundtrip_printparse_RelaxDeps'
]
, testGroup "ProjectConfig printing/parsing round trip"
[ testProperty "packages" prop_roundtrip_printparse_packages
, testProperty "buildonly" prop_roundtrip_printparse_buildonly
, testProperty "shared" prop_roundtrip_printparse_shared
, testProperty "local" prop_roundtrip_printparse_local
, testProperty "specific" prop_roundtrip_printparse_specific
, testProperty "all" prop_roundtrip_printparse_all
]
]
where
usingGhc76orOlder =
case buildCompilerId of
CompilerId GHC v -> v < mkVersion [7,7]
_ -> False
------------------------------------------------
-- Round trip: conversion to/from legacy types
--
roundtrip :: (Eq a, ToExpr a) => (a -> b) -> (b -> a) -> a -> Property
roundtrip f f_inv x =
let y = f x
in x `ediffEq` f_inv y -- no counterexample with y, as they not have ToExpr
roundtrip_legacytypes :: ProjectConfig -> Property
roundtrip_legacytypes =
roundtrip convertToLegacyProjectConfig
convertLegacyProjectConfig
prop_roundtrip_legacytypes_all :: ProjectConfig -> Property
prop_roundtrip_legacytypes_all config =
roundtrip_legacytypes
config {
projectConfigProvenance = mempty
}
prop_roundtrip_legacytypes_packages :: ProjectConfig -> Property
prop_roundtrip_legacytypes_packages config =
roundtrip_legacytypes
config {
projectConfigBuildOnly = mempty,
projectConfigShared = mempty,
projectConfigProvenance = mempty,
projectConfigLocalPackages = mempty,
projectConfigSpecificPackage = mempty
}
prop_roundtrip_legacytypes_buildonly :: ProjectConfigBuildOnly -> Property
prop_roundtrip_legacytypes_buildonly config =
roundtrip_legacytypes
mempty { projectConfigBuildOnly = config }
prop_roundtrip_legacytypes_shared :: ProjectConfigShared -> Property
prop_roundtrip_legacytypes_shared config =
roundtrip_legacytypes
mempty { projectConfigShared = config }
prop_roundtrip_legacytypes_local :: PackageConfig -> Property
prop_roundtrip_legacytypes_local config =
roundtrip_legacytypes
mempty { projectConfigLocalPackages = config }
prop_roundtrip_legacytypes_specific :: Map PackageName PackageConfig -> Property
prop_roundtrip_legacytypes_specific config =
roundtrip_legacytypes
mempty { projectConfigSpecificPackage = MapMappend config }
--------------------------------------------
-- Round trip: printing and parsing config
--
roundtrip_printparse :: ProjectConfig -> Property
roundtrip_printparse config =
case fmap convertLegacyProjectConfig (parseLegacyProjectConfig str) of
ParseOk _ x -> counterexample ("shown: " ++ str) $
x `ediffEq` config { projectConfigProvenance = mempty }
ParseFailed err -> counterexample (show err) False
where
str :: String
str = showLegacyProjectConfig (convertToLegacyProjectConfig config)
prop_roundtrip_printparse_all :: ProjectConfig -> Property
prop_roundtrip_printparse_all config =
roundtrip_printparse config {
projectConfigBuildOnly =
hackProjectConfigBuildOnly (projectConfigBuildOnly config),
projectConfigShared =
hackProjectConfigShared (projectConfigShared config)
}
prop_roundtrip_printparse_packages :: [PackageLocationString]
-> [PackageLocationString]
-> [SourceRepoList]
-> [PackageVersionConstraint]
-> Property
prop_roundtrip_printparse_packages pkglocstrs1 pkglocstrs2 repos named =
roundtrip_printparse
mempty {
projectPackages = map getPackageLocationString pkglocstrs1,
projectPackagesOptional = map getPackageLocationString pkglocstrs2,
projectPackagesRepo = repos,
projectPackagesNamed = named
}
prop_roundtrip_printparse_buildonly :: ProjectConfigBuildOnly -> Property
prop_roundtrip_printparse_buildonly config =
roundtrip_printparse
mempty {
projectConfigBuildOnly = hackProjectConfigBuildOnly config
}
hackProjectConfigBuildOnly :: ProjectConfigBuildOnly -> ProjectConfigBuildOnly
hackProjectConfigBuildOnly config =
config {
-- These two fields are only command line transitory things, not
-- something to be recorded persistently in a config file
projectConfigOnlyDeps = mempty,
projectConfigDryRun = mempty
}
prop_roundtrip_printparse_shared :: ProjectConfigShared -> Property
prop_roundtrip_printparse_shared config =
roundtrip_printparse
mempty {
projectConfigShared = hackProjectConfigShared config
}
hackProjectConfigShared :: ProjectConfigShared -> ProjectConfigShared
hackProjectConfigShared config =
config {
projectConfigProjectFile = mempty, -- not present within project files
projectConfigConfigFile = mempty, -- ditto
projectConfigConstraints =
--TODO: [required eventually] parse ambiguity in constraint
-- "pkgname -any" as either any version or disabled flag "any".
let ambiguous (UserConstraint _ (PackagePropertyFlags flags), _) =
(not . null) [ () | (name, False) <- unFlagAssignment flags
, "any" `isPrefixOf` unFlagName name ]
ambiguous _ = False
in filter (not . ambiguous) (projectConfigConstraints config)
}
prop_roundtrip_printparse_local :: PackageConfig -> Property
prop_roundtrip_printparse_local config =
roundtrip_printparse
mempty {
projectConfigLocalPackages = config
}
prop_roundtrip_printparse_specific :: Map PackageName (NonMEmpty PackageConfig)
-> Property
prop_roundtrip_printparse_specific config =
roundtrip_printparse
mempty {
projectConfigSpecificPackage = MapMappend (fmap getNonMEmpty config)
}
----------------------------
-- Individual Parser tests
--
-- | Helper to parse a given string
--
-- Succeeds only if there is a unique complete parse
runReadP :: Parse.ReadP a a -> String -> Maybe a
runReadP parser s = case [ x | (x,"") <- Parse.readP_to_S parser s ] of
[x'] -> Just x'
_ -> Nothing
prop_parsePackageLocationTokenQ :: PackageLocationString -> Bool
prop_parsePackageLocationTokenQ (PackageLocationString str) =
runReadP parsePackageLocationTokenQ (renderPackageLocationToken str) == Just str
prop_roundtrip_printparse_RelaxedDep :: RelaxedDep -> Property
prop_roundtrip_printparse_RelaxedDep rdep =
counterexample (prettyShow rdep) $
eitherParsec (prettyShow rdep) == Right rdep
prop_roundtrip_printparse_RelaxDeps :: RelaxDeps -> Property
prop_roundtrip_printparse_RelaxDeps rdep =
counterexample (prettyShow rdep) $
Right rdep `ediffEq` eitherParsec (prettyShow rdep)
prop_roundtrip_printparse_RelaxDeps' :: RelaxDeps -> Property
prop_roundtrip_printparse_RelaxDeps' rdep =
counterexample rdep' $
Right rdep `ediffEq` eitherParsec rdep'
where
rdep' = go (prettyShow rdep)
-- replace 'all' tokens by '*'
go :: String -> String
go [] = []
go "all" = "*"
go ('a':'l':'l':c:rest) | c `elem` ":," = '*' : go (c:rest)
go rest = let (x,y) = break (`elem` ":,") rest
(x',y') = span (`elem` ":,^") y
in x++x'++go y'
------------------------
-- Arbitrary instances
--
instance Arbitrary ProjectConfig where
arbitrary =
ProjectConfig
<$> (map getPackageLocationString <$> arbitrary)
<*> (map getPackageLocationString <$> arbitrary)
<*> shortListOf 3 arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> (MapMappend . fmap getNonMEmpty . Map.fromList
<$> shortListOf 3 arbitrary)
-- package entries with no content are equivalent to
-- the entry not existing at all, so exclude empty
shrink ProjectConfig { projectPackages = x0
, projectPackagesOptional = x1
, projectPackagesRepo = x2
, projectPackagesNamed = x3
, projectConfigBuildOnly = x4
, projectConfigShared = x5
, projectConfigProvenance = x6
, projectConfigLocalPackages = x7
, projectConfigSpecificPackage = x8
, projectConfigAllPackages = x9 } =
[ ProjectConfig { projectPackages = x0'
, projectPackagesOptional = x1'
, projectPackagesRepo = x2'
, projectPackagesNamed = x3'
, projectConfigBuildOnly = x4'
, projectConfigShared = x5'
, projectConfigProvenance = x6'
, projectConfigLocalPackages = x7'
, projectConfigSpecificPackage = (MapMappend
(fmap getNonMEmpty x8'))
, projectConfigAllPackages = x9' }
| ((x0', x1', x2', x3'), (x4', x5', x6', x7', x8', x9'))
<- shrink ((x0, x1, x2, x3),
(x4, x5, x6, x7, fmap NonMEmpty (getMapMappend x8), x9))
]
newtype PackageLocationString
= PackageLocationString { getPackageLocationString :: String }
deriving Show
instance Arbitrary PackageLocationString where
arbitrary =
PackageLocationString <$>
oneof
[ show . getNonEmpty <$> (arbitrary :: Gen (NonEmptyList String))
, arbitraryGlobLikeStr
, show <$> (arbitrary :: Gen URI)
]
arbitraryGlobLikeStr :: Gen String
arbitraryGlobLikeStr = outerTerm
where
outerTerm = concat <$> shortListOf1 4
(frequency [ (2, token)
, (1, braces <$> innerTerm) ])
innerTerm = intercalate "," <$> shortListOf1 3
(frequency [ (3, token)
, (1, braces <$> innerTerm) ])
token = shortListOf1 4 (elements (['#'..'~'] \\ "{,}"))
braces s = "{" ++ s ++ "}"
instance Arbitrary ClientInstallFlags where
arbitrary =
ClientInstallFlags
<$> arbitrary
<*> arbitraryFlag arbitraryShortToken
<*> arbitrary
<*> arbitrary
<*> arbitraryFlag arbitraryShortToken
instance Arbitrary ProjectConfigBuildOnly where
arbitrary =
ProjectConfigBuildOnly
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> (toNubList <$> shortListOf 2 arbitrary)
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> (fmap getShortToken <$> arbitrary)
<*> arbitrary
<*> arbitraryNumJobs
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> (fmap getShortToken <$> arbitrary)
<*> arbitrary
<*> (fmap getShortToken <$> arbitrary)
<*> (fmap getShortToken <$> arbitrary)
<*> arbitrary
where
arbitraryNumJobs = fmap (fmap getPositive) <$> arbitrary
shrink ProjectConfigBuildOnly { projectConfigVerbosity = x00
, projectConfigDryRun = x01
, projectConfigOnlyDeps = x02
, projectConfigSummaryFile = x03
, projectConfigLogFile = x04
, projectConfigBuildReports = x05
, projectConfigReportPlanningFailure = x06
, projectConfigSymlinkBinDir = x07
, projectConfigOneShot = x08
, projectConfigNumJobs = x09
, projectConfigKeepGoing = x10
, projectConfigOfflineMode = x11
, projectConfigKeepTempFiles = x12
, projectConfigHttpTransport = x13
, projectConfigIgnoreExpiry = x14
, projectConfigCacheDir = x15
, projectConfigLogsDir = x16
, projectConfigClientInstallFlags = x17 } =
[ ProjectConfigBuildOnly { projectConfigVerbosity = x00'
, projectConfigDryRun = x01'
, projectConfigOnlyDeps = x02'
, projectConfigSummaryFile = x03'
, projectConfigLogFile = x04'
, projectConfigBuildReports = x05'
, projectConfigReportPlanningFailure = x06'
, projectConfigSymlinkBinDir = x07'
, projectConfigOneShot = x08'
, projectConfigNumJobs = postShrink_NumJobs x09'
, projectConfigKeepGoing = x10'
, projectConfigOfflineMode = x11'
, projectConfigKeepTempFiles = x12'
, projectConfigHttpTransport = x13
, projectConfigIgnoreExpiry = x14'
, projectConfigCacheDir = x15
, projectConfigLogsDir = x16
, projectConfigClientInstallFlags = x17' }
| ((x00', x01', x02', x03', x04'),
(x05', x06', x07', x08', x09'),
(x10', x11', x12', x14'),
( x17' ))
<- shrink
((x00, x01, x02, x03, x04),
(x05, x06, x07, x08, preShrink_NumJobs x09),
(x10, x11, x12, x14),
( x17 ))
]
where
preShrink_NumJobs = fmap (fmap Positive)
postShrink_NumJobs = fmap (fmap getPositive)
instance Arbitrary ProjectConfigShared where
arbitrary = do
projectConfigDistDir <- arbitraryFlag arbitraryShortToken
projectConfigConfigFile <- arbitraryFlag arbitraryShortToken
projectConfigProjectFile <- arbitraryFlag arbitraryShortToken
projectConfigIgnoreProject <- arbitrary
projectConfigHcFlavor <- arbitrary
projectConfigHcPath <- arbitraryFlag arbitraryShortToken
projectConfigHcPkg <- arbitraryFlag arbitraryShortToken
projectConfigHaddockIndex <- arbitrary
projectConfigRemoteRepos <- arbitrary
projectConfigLocalNoIndexRepos <- arbitrary
projectConfigActiveRepos <- arbitrary
projectConfigIndexState <- arbitrary
projectConfigStoreDir <- arbitraryFlag arbitraryShortToken
projectConfigConstraints <- arbitraryConstraints
projectConfigPreferences <- shortListOf 2 arbitrary
projectConfigCabalVersion <- arbitrary
projectConfigSolver <- arbitrary
projectConfigAllowOlder <- arbitrary
projectConfigAllowNewer <- arbitrary
projectConfigWriteGhcEnvironmentFilesPolicy <- arbitrary
projectConfigMaxBackjumps <- arbitrary
projectConfigReorderGoals <- arbitrary
projectConfigCountConflicts <- arbitrary
projectConfigFineGrainedConflicts <- arbitrary
projectConfigMinimizeConflictSet <- arbitrary
projectConfigStrongFlags <- arbitrary
projectConfigAllowBootLibInstalls <- arbitrary
projectConfigOnlyConstrained <- arbitrary
projectConfigPerComponent <- arbitrary
projectConfigIndependentGoals <- arbitrary
projectConfigProgPathExtra <- toNubList <$> listOf arbitraryShortToken
return ProjectConfigShared {..}
where
arbitraryConstraints :: Gen [(UserConstraint, ConstraintSource)]
arbitraryConstraints =
fmap (\uc -> (uc, projectConfigConstraintSource)) <$> arbitrary
shrink ProjectConfigShared {..} = runShrinker $ pure ProjectConfigShared
<*> shrinker projectConfigDistDir
<*> shrinker projectConfigConfigFile
<*> shrinker projectConfigProjectFile
<*> shrinker projectConfigIgnoreProject
<*> shrinker projectConfigHcFlavor
<*> shrinkerAla (fmap NonEmpty) projectConfigHcPath
<*> shrinkerAla (fmap NonEmpty) projectConfigHcPkg
<*> shrinker projectConfigHaddockIndex
<*> shrinker projectConfigRemoteRepos
<*> shrinker projectConfigLocalNoIndexRepos
<*> shrinker projectConfigActiveRepos
<*> shrinker projectConfigIndexState
<*> shrinker projectConfigStoreDir
<*> shrinkerPP preShrink_Constraints postShrink_Constraints projectConfigConstraints
<*> shrinker projectConfigPreferences
<*> shrinker projectConfigCabalVersion
<*> shrinker projectConfigSolver
<*> shrinker projectConfigAllowOlder
<*> shrinker projectConfigAllowNewer
<*> shrinker projectConfigWriteGhcEnvironmentFilesPolicy
<*> shrinker projectConfigMaxBackjumps
<*> shrinker projectConfigReorderGoals
<*> shrinker projectConfigCountConflicts
<*> shrinker projectConfigFineGrainedConflicts
<*> shrinker projectConfigMinimizeConflictSet
<*> shrinker projectConfigStrongFlags
<*> shrinker projectConfigAllowBootLibInstalls
<*> shrinker projectConfigOnlyConstrained
<*> shrinker projectConfigPerComponent
<*> shrinker projectConfigIndependentGoals
<*> shrinker projectConfigProgPathExtra
where
preShrink_Constraints = map fst
postShrink_Constraints = map (\uc -> (uc, projectConfigConstraintSource))
projectConfigConstraintSource :: ConstraintSource
projectConfigConstraintSource =
ConstraintSourceProjectConfig "TODO"
instance Arbitrary ProjectConfigProvenance where
arbitrary = elements [Implicit, Explicit "cabal.project"]
instance Arbitrary PackageConfig where
arbitrary =
PackageConfig
<$> (MapLast . Map.fromList <$> shortListOf 10
((,) <$> arbitraryProgramName
<*> arbitraryShortToken))
<*> (MapMappend . Map.fromList <$> shortListOf 10
((,) <$> arbitraryProgramName
<*> listOf arbitraryShortToken))
<*> (toNubList <$> listOf arbitraryShortToken)
<*> arbitrary
<*> arbitrary <*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
<*> shortListOf 5 arbitraryShortToken
<*> arbitrary
<*> arbitrary <*> arbitrary
<*> shortListOf 5 arbitraryShortToken
<*> shortListOf 5 arbitraryShortToken
<*> shortListOf 5 arbitraryShortToken
<*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitraryFlag arbitraryShortToken
<*> arbitrary
<*> arbitrary
<*> arbitrary <*> arbitrary
<*> arbitrary
<*> arbitraryFlag arbitraryShortToken
<*> arbitrary
<*> arbitrary
<*> arbitraryFlag arbitraryShortToken
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitraryFlag arbitraryShortToken
<*> arbitrary
<*> shortListOf 5 arbitrary
<*> shortListOf 5 arbitrary
where
arbitraryProgramName :: Gen String
arbitraryProgramName =
elements [ programName prog
| (prog, _) <- knownPrograms (defaultProgramDb) ]
shrink PackageConfig { packageConfigProgramPaths = x00
, packageConfigProgramArgs = x01
, packageConfigProgramPathExtra = x02
, packageConfigFlagAssignment = x03
, packageConfigVanillaLib = x04
, packageConfigSharedLib = x05
, packageConfigStaticLib = x42
, packageConfigDynExe = x06
, packageConfigFullyStaticExe = x50
, packageConfigProf = x07
, packageConfigProfLib = x08
, packageConfigProfExe = x09
, packageConfigProfDetail = x10
, packageConfigProfLibDetail = x11
, packageConfigConfigureArgs = x12
, packageConfigOptimization = x13
, packageConfigProgPrefix = x14
, packageConfigProgSuffix = x15
, packageConfigExtraLibDirs = x16
, packageConfigExtraFrameworkDirs = x17
, packageConfigExtraIncludeDirs = x18
, packageConfigGHCiLib = x19
, packageConfigSplitSections = x20
, packageConfigSplitObjs = x20_1
, packageConfigStripExes = x21
, packageConfigStripLibs = x22
, packageConfigTests = x23
, packageConfigBenchmarks = x24
, packageConfigCoverage = x25
, packageConfigRelocatable = x26
, packageConfigDebugInfo = x27
, packageConfigRunTests = x28
, packageConfigDocumentation = x29
, packageConfigHaddockHoogle = x30
, packageConfigHaddockHtml = x31
, packageConfigHaddockHtmlLocation = x32
, packageConfigHaddockForeignLibs = x33
, packageConfigHaddockExecutables = x33_1
, packageConfigHaddockTestSuites = x34
, packageConfigHaddockBenchmarks = x35
, packageConfigHaddockInternal = x36
, packageConfigHaddockCss = x37
, packageConfigHaddockLinkedSource = x38
, packageConfigHaddockQuickJump = x43
, packageConfigHaddockHscolourCss = x39
, packageConfigHaddockContents = x40
, packageConfigHaddockForHackage = x41
, packageConfigTestHumanLog = x44
, packageConfigTestMachineLog = x45
, packageConfigTestShowDetails = x46
, packageConfigTestKeepTix = x47
, packageConfigTestWrapper = x48
, packageConfigTestFailWhenNoTestSuites = x49
, packageConfigTestTestOptions = x51
, packageConfigBenchmarkOptions = x52 } =
[ PackageConfig { packageConfigProgramPaths = postShrink_Paths x00'
, packageConfigProgramArgs = postShrink_Args x01'
, packageConfigProgramPathExtra = x02'
, packageConfigFlagAssignment = x03'
, packageConfigVanillaLib = x04'
, packageConfigSharedLib = x05'
, packageConfigStaticLib = x42'
, packageConfigDynExe = x06'
, packageConfigFullyStaticExe = x50'
, packageConfigProf = x07'
, packageConfigProfLib = x08'
, packageConfigProfExe = x09'
, packageConfigProfDetail = x10'
, packageConfigProfLibDetail = x11'
, packageConfigConfigureArgs = map getNonEmpty x12'
, packageConfigOptimization = x13'
, packageConfigProgPrefix = x14'
, packageConfigProgSuffix = x15'
, packageConfigExtraLibDirs = map getNonEmpty x16'
, packageConfigExtraFrameworkDirs = map getNonEmpty x17'
, packageConfigExtraIncludeDirs = map getNonEmpty x18'
, packageConfigGHCiLib = x19'
, packageConfigSplitSections = x20'
, packageConfigSplitObjs = x20_1'
, packageConfigStripExes = x21'
, packageConfigStripLibs = x22'
, packageConfigTests = x23'
, packageConfigBenchmarks = x24'
, packageConfigCoverage = x25'
, packageConfigRelocatable = x26'
, packageConfigDebugInfo = x27'
, packageConfigRunTests = x28'
, packageConfigDocumentation = x29'
, packageConfigHaddockHoogle = x30'
, packageConfigHaddockHtml = x31'
, packageConfigHaddockHtmlLocation = x32'
, packageConfigHaddockForeignLibs = x33'
, packageConfigHaddockExecutables = x33_1'
, packageConfigHaddockTestSuites = x34'
, packageConfigHaddockBenchmarks = x35'
, packageConfigHaddockInternal = x36'
, packageConfigHaddockCss = fmap getNonEmpty x37'
, packageConfigHaddockLinkedSource = x38'
, packageConfigHaddockQuickJump = x43'
, packageConfigHaddockHscolourCss = fmap getNonEmpty x39'
, packageConfigHaddockContents = x40'
, packageConfigHaddockForHackage = x41'
, packageConfigTestHumanLog = x44'
, packageConfigTestMachineLog = x45'
, packageConfigTestShowDetails = x46'
, packageConfigTestKeepTix = x47'
, packageConfigTestWrapper = x48'
, packageConfigTestFailWhenNoTestSuites = x49'
, packageConfigTestTestOptions = x51'
, packageConfigBenchmarkOptions = x52' }
| (((x00', x01', x02', x03', x04'),
(x05', x42', x06', x50', x07', x08', x09'),
(x10', x11', x12', x13', x14'),
(x15', x16', x17', x18', x19')),
((x20', x20_1', x21', x22', x23', x24'),
(x25', x26', x27', x28', x29'),
(x30', x31', x32', (x33', x33_1'), x34'),
(x35', x36', x37', x38', x43', x39'),
(x40', x41'),
(x44', x45', x46', x47', x48', x49', x51', x52')))
<- shrink
(((preShrink_Paths x00, preShrink_Args x01, x02, x03, x04),
(x05, x42, x06, x50, x07, x08, x09),
(x10, x11, map NonEmpty x12, x13, x14),
(x15, map NonEmpty x16,
map NonEmpty x17,
map NonEmpty x18,
x19)),
((x20, x20_1, x21, x22, x23, x24),
(x25, x26, x27, x28, x29),
(x30, x31, x32, (x33, x33_1), x34),
(x35, x36, fmap NonEmpty x37, x38, x43, fmap NonEmpty x39),
(x40, x41),
(x44, x45, x46, x47, x48, x49, x51, x52)))
]
where
preShrink_Paths = Map.map NonEmpty
. Map.mapKeys NoShrink
. getMapLast
postShrink_Paths = MapLast
. Map.map getNonEmpty
. Map.mapKeys getNoShrink
preShrink_Args = Map.map (NonEmpty . map NonEmpty)
. Map.mapKeys NoShrink
. getMapMappend
postShrink_Args = MapMappend
. Map.map (map getNonEmpty . getNonEmpty)
. Map.mapKeys getNoShrink
instance f ~ [] => Arbitrary (SourceRepositoryPackage f) where
arbitrary = SourceRepositoryPackage
<$> arbitrary
<*> (getShortToken <$> arbitrary)
<*> (fmap getShortToken <$> arbitrary)
<*> (fmap getShortToken <$> arbitrary)
<*> (fmap getShortToken <$> shortListOf 3 arbitrary)
shrink (SourceRepositoryPackage x1 x2 x3 x4 x5) =
[ SourceRepositoryPackage
x1'
(getShortToken x2')
(fmap getShortToken x3')
(fmap getShortToken x4')
(fmap getShortToken x5')
| (x1', x2', x3', x4', x5') <- shrink
(x1, ShortToken x2, fmap ShortToken x3, fmap ShortToken x4, fmap ShortToken x5)
]
instance Arbitrary RemoteRepo where
arbitrary =
RemoteRepo
<$> arbitrary
<*> arbitrary -- URI
<*> arbitrary
<*> listOf arbitraryRootKey
<*> fmap getNonNegative arbitrary
<*> pure False
where
arbitraryRootKey =
shortListOf1 5 (oneof [ choose ('0', '9')
, choose ('a', 'f') ])
instance Arbitrary LocalRepo where
arbitrary = LocalRepo
<$> arbitrary
<*> elements ["/tmp/foo", "/tmp/bar"] -- TODO: generate valid absolute paths
<*> arbitrary
instance Arbitrary PreSolver where
arbitrary = elements [minBound..maxBound]
instance Arbitrary ReorderGoals where
arbitrary = ReorderGoals <$> arbitrary
instance Arbitrary CountConflicts where
arbitrary = CountConflicts <$> arbitrary
instance Arbitrary FineGrainedConflicts where
arbitrary = FineGrainedConflicts <$> arbitrary
instance Arbitrary MinimizeConflictSet where
arbitrary = MinimizeConflictSet <$> arbitrary
instance Arbitrary IndependentGoals where
arbitrary = IndependentGoals <$> arbitrary
instance Arbitrary StrongFlags where
arbitrary = StrongFlags <$> arbitrary
instance Arbitrary AllowBootLibInstalls where
arbitrary = AllowBootLibInstalls <$> arbitrary
instance Arbitrary OnlyConstrained where
arbitrary = oneof [ pure OnlyConstrainedAll
, pure OnlyConstrainedNone
]