packages feed

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