packages feed

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