@@ -1,22 +1,56 @@
1+{-# LANGUAGE ScopedTypeVariables #-}
1{-# LANGUAGE OverloadedStrings, NoImplicitPrelude #-}
2{-# LANGUAGE OverloadedStrings, NoImplicitPrelude #-}
2module Stackage.BuildPlanSpec (spec) where
3module Stackage.BuildPlanSpec (spec) where
4−import Stackage.BuildPlan
5−import Stackage.Prelude
6−import Stackage.BuildConstraints
7−import Stackage.UpdateBuildPlan
9−import qualified Data.Yaml as Y
10−import Distribution.Version (anyVersion)
11import qualified Data.Map as Map
5import qualified Data.Map as Map
6+import qualified Data.Map.Strict as M
7+import qualified Data.Set as S
9+import qualified Data.Yaml as Y
10+import Distribution.Version
12−import Network.HTTP.Client (withManager)
11+import Network.HTTP.Client
13−import Network.HTTP.Client.TLS (tlsManagerSettings)
12+import Network.HTTP.Client.TLS (tlsManagerSettings)
13+import Stackage.BuildConstraints
14+import Stackage.BuildPlan
15+import Stackage.CheckBuildPlan
16+import Stackage.PackageDescription
17+import Stackage.Prelude
18+import Stackage.UpdateBuildPlan
15spec :: Spec
21spec :: Spec
23+ it "simple package set" $ check testBuildConstraints $ makePackageSet
24+ [("foo", [0, 0, 0], [("bar", thisV [0, 0, 0])])
25+ ,("bar", [0, 0, 0], [])]
26+ it "bad version range on depdendency fails" $ badBuildPlan $ makePackageSet
27+ [("foo", [0, 0, 0], [("bar", thisV [1, 1, 0])])
28+ ,("bar", [0, 0, 0], [])]
29+ it "nonexistent package fails to check" $ badBuildPlan $ makePackageSet
30+ [("foo", [0, 0, 0], [("nonexistent", thisV [0, 0, 0])])
31+ ,("bar", [0, 0, 0], [])]
32+ it "default package set checks ok" $ check defaultBuildConstraints getLatestAllowedPlans
34+-- | Checking should be considered a bad build plan.
35+badBuildPlan :: (BuildConstraints -> IO (Map PackageName PackagePlan))
39+ mu <- try (check testBuildConstraints m)
41+ Left (_ :: BadBuildPlan) ->
44+ error "Expected bad build plan."
46+-- | Check build plan with the given package set getter.
47+check :: (Manager -> IO BuildConstraints)
48+ -> (BuildConstraints -> IO (Map PackageName PackagePlan))
16−spec = it "works" $ withManager tlsManagerSettings $ \man -> do
50+check readPlanFile getPlans = withManager tlsManagerSettings $ \man -> do
17− bc <- defaultBuildConstraints man
51+ bc <- readPlanFile man
18− pkgs <- getLatestAllowedPlans bc
52+ plans <- getPlans bc
19− bp <- newBuildPlan pkgs bc
53+ bp <- newBuildPlan plans bc
20 let bs = Y.encode bp
54 let bs = Y.encode bp
21 ebp' = Y.decodeEither bs
55 ebp' = Y.decodeEither bs
@@ -26,14 +60,74 @@ spec = it "works" $ withManager tlsManagerSettings $ \man -> do
26 forM_ allPackages $ \name ->
60 forM_ allPackages $ \name ->
27 (name, lookup name (bpPackages bp')) `shouldBe`
61 (name, lookup name (bpPackages bp')) `shouldBe`
28 (name, lookup name (bpPackages bp))
62 (name, lookup name (bpPackages bp))
30 bpGithubUsers bp' `shouldBe` bpGithubUsers bp
63 bpGithubUsers bp' `shouldBe` bpGithubUsers bp
31 when (bp' /= bp) $ error "bp' /= bp"
65 when (bp' /= bp) $ error "bp' /= bp"
32− bp2 <- updateBuildPlan pkgs bp
66+ bp2 <- updateBuildPlan plans bp
33 when (dropVersionRanges bp2 /= dropVersionRanges bp) $ error "bp2 /= bp"
67 when (dropVersionRanges bp2 /= dropVersionRanges bp) $ error "bp2 /= bp"
35 dropVersionRanges bp =
70 dropVersionRanges bp =
36 bp { bpPackages = map go $ bpPackages bp }
71 bp { bpPackages = map go $ bpPackages bp }
38 go pb = pb { ppConstraints = go' $ ppConstraints pb }
73 go pb = pb { ppConstraints = go' $ ppConstraints pb }
39 go' pc = pc { pcVersionRange = anyVersion }
74 go' pc = pc { pcVersionRange = anyVersion }
76+-- | Make a package set from a convenient data structure.
78+ :: [(String,[Int],[(String,VersionRange)])]
80+ -> IO (Map PackageName PackagePlan)
92+ , DepInfo {diComponents = S.fromList
98+ dummyPackage v deps =
100+ {ppVersion = Version v []
101+ ,ppGithubPings = mempty
105+ {pcVersionRange = anyV
106+ ,pcMaintainer = Nothing
107+ ,pcTests = Don'tBuild
108+ ,pcHaddocks = Don'tBuild
109+ ,pcBuildBenchmarks = False
110+ ,pcFlagOverrides = mempty
111+ ,pcEnableLibProfile = False}
116+ ,sdProvidedExes = mempty
117+ ,sdModules = mempty}}
119+-- | This exact version is required.
120+thisV :: [Int] -> VersionRange
121+thisV ver = thisVersion (Version ver [])
123+-- | Accept any version.
128+testBuildConstraints :: void -> IO BuildConstraints
129+testBuildConstraints _ =
133+ where fp = "test/test-build-constraints.yaml"