staversion-0.2.4.0: test/Staversion/Internal/BuildPlan/CoreSpec.hs
module Staversion.Internal.BuildPlan.CoreSpec (main,spec) where
import qualified Data.ByteString.Lazy as BSL
import qualified Data.HashMap.Strict as HM
import Data.Text (unpack)
import System.FilePath ((</>))
import Test.Hspec
import Staversion.Internal.BuildPlan.BuildPlanMap (HasVersions(..))
import Staversion.Internal.BuildPlan.Core
( CoreBuildPlanMap(..),
CompilerVersion(..),
Compiler(..),
parseGHCPkgVersions,
ghcName,
mkCompilerVersion
)
import Staversion.Internal.Query (PackageName)
import Staversion.Internal.Version (Version, mkVersion)
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
describe "CoreBuildPlanMap" $ do
describe "ghc" $ do
specGHCAll
specGHCPlan (mkCompilerVersion [8,8,2]) "bytestring" (Just [0,10,10,0])
specGHCPlan (mkCompilerVersion [8,8,2]) "foobar" (Nothing)
specGHCPlan (mkCompilerVersion [7,8,4]) "ghc" (Just [7,8,4])
specGHCPlan (mkCompilerVersion [7,8,4]) "haskell2010" (Just [1,1,2,0])
specGHCPlan (mkCompilerVersion [8,4,1]) "Win32" (Just [2,6,1,0])
specGHCPlan CVHead "Cabal" (Just [3,3,0,0])
specGHCPlan CVHead "ghc" (Just [8,11,0,20200324])
specGHCPlan CVHead "Win32" (Just [2,6,1,0])
specGHCPlan (mkCompilerVersion [8,4,1]) "rts" (Just [1,0])
specGHCAll :: Spec
specGHCAll = do
specify "load all GHC versions" $ do
ep <- loadPkgVersions
case ep of
Left e -> expectationFailure e
Right p -> (map compilerVersion $ HM.keys p) `shouldMatchList` exp_versions
where
exp_versions = CVHead : (map mkCompilerVersion $ exp_nvers)
exp_nvers =
[ [7,0,1],
[7,0,2],
[7,0,3],
[7,0,4],
[7,2,1],
[7,2,2],
[7,4,1],
[7,4,2],
[7,6,1],
[7,6,2],
[7,6,3],
[7,8,1],
[7,8,2],
[7,8,3],
[7,8,4],
[7,10,1],
[7,10,2],
[7,10,3],
[8,0,1],
[8,0,2],
[8,2,1],
[8,2,2],
[8,4,1],
[8,4,2],
[8,4,3],
[8,4,4],
[8,6,1],
[8,6,2],
[8,6,3],
[8,6,4],
[8,6,5],
[8,8,1],
[8,8,2],
[8,8,3],
[8,10,1]
]
specGHCPlan :: CompilerVersion -- ^ GHC version
-> PackageName -- ^ Package to query
-> Maybe [Int] -- ^ Expected version
-> Spec
specGHCPlan cv pname exp_version_list = do
specify spec_name $ do
ecbp <- loadGHCCore cv
case ecbp of
Left err -> expectationFailure err
Right cbp -> do
coreCompiler cbp `shouldBe` exp_compiler
packageVersion cbp pname `shouldBe` exp_version
where
spec_name = "ghc " ++ show cv ++ ", query " ++ unpack pname
exp_compiler = Compiler ghcName cv
exp_version = fmap mkVersion $ exp_version_list
loadPkgVersions :: IO (Either String (HM.HashMap Compiler CoreBuildPlanMap))
loadPkgVersions = fmap parseGHCPkgVersions $ BSL.readFile pkg_version_file
where
pkg_version_file = "test" </> "data" </> "build_plan_ghc" </> "pkg_versions.txt"
loadGHCCore :: CompilerVersion -> IO (Either String CoreBuildPlanMap)
loadGHCCore cv = do
ret <- (fmap . fmap) (HM.lookup ghc) $ loadPkgVersions
case ret of
Left err -> return $ Left ("loadGHCCore: parse error: " ++ err)
Right Nothing -> return $ Left ("loadGHCCore: cannot find build plan for " ++ show ghc)
Right (Just cbp) -> return $ Right cbp
where
ghc = Compiler ghcName cv