hpack-0.18.0: test/HpackSpec.hs
module HpackSpec (spec) where
import Helper
import Prelude ()
import Prelude.Compat
import Control.Monad.Compat
import Control.DeepSeq
import Data.Version (Version(..), showVersion)
import Test.QuickCheck
import Hpack
makeVersion :: [Int] -> Version
makeVersion v = Version v []
spec :: Spec
spec = do
describe "parseVerbosity" $ do
it "returns True by default" $ do
parseVerbosity ["foo"] `shouldBe` (True, ["foo"])
context "with --silent" $ do
it "returns False" $ do
parseVerbosity ["--silent"] `shouldBe` (False, [])
describe "extractVersion" $ do
it "extracts Hpack version from a cabal file" $ do
let cabalFile = ["-- This file has been generated from package.yaml by hpack version 0.10.0."]
extractVersion cabalFile `shouldBe` Just (Version [0, 10, 0] [])
it "is total" $ do
let cabalFile = ["-- This file has been generated from package.yaml by hpack version "]
extractVersion cabalFile `shouldBe` Nothing
describe "parseVersion" $ do
it "is inverse to showVersion" $ do
let positive = getPositive <$> arbitrary
forAll (replicateM 3 positive) $ \xs -> do
let v = Version xs []
parseVersion (showVersion v) `shouldBe` Just v
describe "hpackWithVersion" $ do
context "when only the hpack version in the cabal file header changed" $ do
it "does not write a new cabal file" $ do
inTempDirectory $ do
writeFile "package.yaml" "name: foo"
hpackWithVersion (makeVersion [0,8,0]) Nothing False
old <- readFile "foo.cabal" >>= (return $!!)
hpackWithVersion (makeVersion [0,10,0]) Nothing False
readFile "foo.cabal" `shouldReturn` old
context "when exsting cabal file was generated with a newer version of hpack" $ do
it "does not re-generate" $ do
inTempDirectory $ do
writeFile "package.yaml" $ unlines [
"name: foo"
, "version: 0.1.0"
]
hpackWithVersion (makeVersion [0,10,0]) Nothing False
old <- readFile "foo.cabal" >>= (return $!!)
writeFile "package.yaml" $ unlines [
"name: foo"
, "version: 0.2.0"
]
hpackWithVersion (makeVersion [0,8,0]) Nothing False
readFile "foo.cabal" `shouldReturn` old
describe "splitDirectory" $ do
context "when given Nothing" $ do
it "defaults file name to package.yaml" $ do
splitDirectory Nothing `shouldReturn` (Nothing, "package.yaml")
context "when given a directory" $ do
it "defaults file name to package.yaml" $ do
withTempDirectory $ \dir -> do
splitDirectory (Just dir) `shouldReturn` (Just dir, "package.yaml")
context "when given a file name" $ do
it "defaults directory to Nothing" $ do
inTempDirectory $ do
touch "foo.yaml"
splitDirectory (Just "foo.yaml") `shouldReturn` (Nothing, "foo.yaml")
context "when given a path to a file" $ do
it "splits directory from file name" $ do
withTempDirectory $ \dir -> do
let file = dir </> "foo.yaml"
touch file
splitDirectory (Just file) `shouldReturn` (Just dir, "foo.yaml")
context "when path does not exist" $ do
it "defaults directory to Nothing" $ do
inTempDirectory $ do
splitDirectory (Just "test/foo.yaml") `shouldReturn` (Just "test", "foo.yaml")
context "when file does not exist" $ do
it "defaults directory to Nothing" $ do
inTempDirectory $ do
splitDirectory (Just "test") `shouldReturn` (Nothing, "test")
context "when directory does not exist" $ do
it "defaults directory to Nothing" $ do
inTempDirectory $ do
splitDirectory (Just "test/") `shouldReturn` (Just "test", "package.yaml")