staversion-0.1.1.0: test/Staversion/Internal/BuildPlan/StackageSpec.hs
module Staversion.Internal.BuildPlan.StackageSpec (main,spec) where
import Control.Applicative ((<$>), (<*>), pure)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import System.FilePath ((</>), (<.>))
import Test.Hspec
import Test.QuickCheck (Arbitrary(..), oneof, property, Gen)
import Staversion.Internal.BuildPlan.Stackage
( parseResolverString, formatResolverString,
PartialResolver(..), ExactResolver(..),
Disambiguator, parseDisambiguator
)
instance Arbitrary ExactResolver where
arbitrary = oneof [ ExactLTS <$> arbitrary <*> arbitrary,
ExactNightly <$> arbitrary <*> arbitrary <*> arbitrary
]
instance Arbitrary PartialResolver where
arbitrary = oneof [ PartialExact <$> arbitrary,
pure PartialLTSLatest,
PartialLTSMajor <$> arbitrary,
pure PartialNightlyLatest
]
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
parse_spec
format_spec
parseDis_spec
parse_spec :: Spec
parse_spec = describe "parseResolverString" $ do
ex "lts-7.0" (Just $ PartialExact $ ExactLTS 7 0)
ex "lts-2.22" (Just $ PartialExact $ ExactLTS 2 22)
ex "lts-4" (Just $ PartialLTSMajor 4)
ex "lts" (Just $ PartialLTSLatest)
ex "nightly-2016-10-21" (Just $ PartialExact $ ExactNightly 2016 10 21)
ex "nightly" (Just $ PartialNightlyLatest)
ex "hoge" Nothing
ex "lts-5." (Just $ PartialLTSMajor 5)
ex "lts-" Nothing
ex "nightly-2016" Nothing
ex "nightly-2016-10-" Nothing
where
ex input expected = specify input $ parseResolverString input `shouldBe` expected
format_spec :: Spec
format_spec = describe "formatResolverString" $ do
it "should generate parsable string" $ property $ \presolver ->
(parseResolverString $ formatResolverString presolver) == Just presolver
it "should pad nightly month/day with 0" $ do
formatResolverString (PartialExact $ ExactNightly 2010 1 8) `shouldBe` "nightly-2010-01-08"
parseDis_spec :: Spec
parseDis_spec = describe "parseDisambiguator" $ do
describe "snapshots.json" $ before (loadDisambiguator "snapshots.json") $ do
it "disambiguates exact resolvers" $ \dis -> property $ \p_exact -> do
dis (PartialExact p_exact) == Just p_exact
it "disambiguates lts-2" $ \dis -> do
dis (PartialLTSMajor 2) `shouldBe` Just (ExactLTS 2 22)
it "disambiguates lts" $ \dis -> do
dis (PartialLTSLatest) `shouldBe` Just (ExactLTS 7 5)
it "disambiguates nightly" $ \dis -> do
dis (PartialNightlyLatest) `shouldBe` Just (ExactNightly 2016 10 22)
it "cannot disambiguate lts future version" $ \dis -> do
dis (PartialLTSMajor 999) `shouldBe` Nothing
loadDisambiguator :: FilePath -> IO Disambiguator
loadDisambiguator file_name = expectJust =<< (parseDisambiguator <$> BSL.fromStrict <$> BS.readFile file_path) where
file_path = "test" </> "data" </> file_name
expectJust Nothing = error "parse should succeed"
expectJust (Just d) = return d