packages feed

hackport-0.6.6: tests/Portage/PackageIdSpec.hs

module Portage.PackageIdSpec (spec) where

import           Test.Hspec
import           Test.Hspec.QuickCheck
import           Test.QuickCheck
import           QuickCheck.Instances

import qualified Data.Char as Char
import qualified Distribution.Package as Cabal
import           Distribution.Pretty (prettyShow)

import           Portage.PackageId

spec :: Spec
spec = do
  describe "packageIdToFilePath" $ do
    prop "transforms a PackageId into a FilePath" $ do
      let cat = Category "dev-haskell"
          name = Cabal.mkPackageName "foo-bar2+"
        in \(ComplexVersion version) ->
             packageIdToFilePath (PackageId (PackageName cat name) version)
             `shouldBe`
             "dev-haskell/" ++ prettyShow name ++ "/" ++ prettyShow name ++ "-" ++
             prettyShow version ++ ".ebuild"

  describe "filePathToPackageId" $ do
    prop "returns a Just PackageId from a valid FilePath" $ do
      let cat = Category "dev-haskell"
          name = Cabal.mkPackageName "foo-bar2+"
        in \(ComplexVersion version) ->
             filePathToPackageId cat
             (prettyShow name ++ "-" ++ prettyShow version)
             `shouldBe`
             Just (PackageId (PackageName cat name) version)
    prop "returns Nothing on a malformed FilePath" $ do
      let cat = Category "dev-haskell"
          name = Cabal.mkPackageName "foo-bar-2+"
        in \(ComplexVersion version) ->
             filePathToPackageId cat (prettyShow name ++ "-" ++ prettyShow version)
             `shouldBe`
             Nothing

  describe "normalizeCabalPackageName" $ do
    prop "converts a Cabal.PackageName into lowercase" $ do
      \(PrintableString s) -> normalizeCabalPackageName (Cabal.mkPackageName s)
                            `shouldBe` Cabal.mkPackageName (Char.toLower <$> s)

  describe "parseFriendlyPackage" $ do
    prop "parses a package string as [category/]name[-version]" $ do
      let cat = Category "dev-haskell"
          name = Cabal.mkPackageName "package-name1+"
        in \(ComplexVersion version) ->
             parseFriendlyPackage (prettyShow cat ++ "/" ++ prettyShow name
                                    ++ "-" ++ prettyShow version)
             `shouldBe`
             Right (Just cat, name, Just version)
    prop "returns an error string if parsing a malformed package string" $ do
      let cat = Category "dev-haskell"
          name = Cabal.mkPackageName "package-name-1+"
        in \(ComplexVersion version) ->
             parseFriendlyPackage (prettyShow cat ++ "/" ++ prettyShow name
                                   ++ "-" ++ prettyShow version)
             `shouldNotBe`
             Right (Just cat, name, Just version)

  describe "cabal_pn_to_PN" $ do
    prop "pretty-prints a Cabal PackageName as a lowercase String" $ do
      \(PrintableString s) -> cabal_pn_to_PN (Cabal.mkPackageName s)
                            `shouldBe` Char.toLower <$> s