packages feed

extensions-0.0.0.0: test/Test/Extensions.hs

module Test.Extensions
    ( getExtensionsSpec
    ) where

import Data.ByteString (ByteString)
import Data.Map.Strict (Map)
import Data.Maybe (fromMaybe)
import Data.Set (Set)
import GHC.LanguageExtensions.Type (Extension (..))
import Test.Hspec (Spec, describe, it, shouldBe)

import Extensions (getModuleExtentions, getModuleExtentionsBySource, getPackageExtentions,
                   getPackageExtentionsBySources)
import Extensions.Types (Extensions (..), ExtensionsError (..), ExtensionsResult,
                         OnOffExtension (..), ParsedExtensions (..))
import Test.Extensions.Cabal (defaultExtensions)

import qualified Data.ByteString as BS
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set


getExtensionsSpec :: Spec
getExtensionsSpec = describe "Get Extensions" $ do
    it "should getPackageExtensions" $
        getPackageExtentions cabal >>= \res -> res `shouldBe` resultMap
    it "should getPackageExtensionsBySource" $ do
        res <- sources >>= getPackageExtentionsBySources cabal
        res `shouldBe` resultMap
    it "should getPackageExtensionsBySource, return NonCabalModule" $ do
        srcs <- sources
        res <- getPackageExtentionsBySources cabal $
            Map.insert unknownModule "Hello" srcs
        res `shouldBe` Map.insert unknownModule (Left $ NotCabalModule unknownModule) resultMap
    it "should getPackageExtensionsBySource, return SourceNotFound" $ do
        srcs <- sources
        res <- getPackageExtentionsBySources cabal $
            Map.delete knownModule srcs
        res `shouldBe` Map.insert knownModule (Left $ SourceNotFound knownModule) resultMap
    it "should getModuleExtensions" $ do
        res <- getModuleExtentions cabal knownModule
        res `shouldBe` Right exts
    it "should getModuleExtensions, return NotCabalModule" $ do
        res <- getModuleExtentions cabal unknownModule
        res `shouldBe` Left (NotCabalModule unknownModule)
    it "should getModuleExtensionsBySource" $ do
        res <- knownSource >>= getModuleExtentionsBySource cabal knownModule
        res `shouldBe` Right exts
    it "should getModuleExtensions, return NotCabalModule" $ do
        res <- getModuleExtentionsBySource cabal unknownModule "Hello"
        res `shouldBe` Left (NotCabalModule unknownModule)

resultMap :: Map FilePath ExtensionsResult
resultMap = Map.fromList
    [ "app/Cli.hs"                     `to` Right
        (extsPlus $ Set.singleton (On ApplicativeDo))
    , "app/Main.hs"                    `to` Right exts
    , "src/Extensions.hs"              `to` Right exts
    , "src/Extensions/Cabal.hs"        `to` Right
        (extsPlus $ Set.singleton $ On Cpp )
    , "src/Extensions/Module.hs"       `to` Right exts
    , "src/Extensions/Package.hs"      `to` Right exts
    , "src/Extensions/Types.hs"        `to` Right
        (extsPlus $ Set.singleton $ On DeriveAnyClass )
    , "test/Test/Extensions.hs"        `to` Right exts
    , "test/Test/Extensions/Cabal.hs"  `to` Right exts
    , "test/Test/Extensions/Module.hs" `to` Right exts
    , "test/Test/Extensions/Types.hs"  `to` Right exts
    , "test/Spec.hs"                   `to` Right exts
    ]
  where
    to = (,)

exts :: Extensions
exts = Extensions
    { extensionsAll = Set.fromList $ parsedExtensionsAll defaultExtensions
    , extensionsSafe = Nothing
    }

extsPlus :: Set OnOffExtension -> Extensions
extsPlus s = exts
    { extensionsAll = extensionsAll exts <> s
    }

sources :: IO (Map FilePath ByteString)
sources = Map.traverseWithKey (\f _ -> BS.readFile f) resultMap

cabal :: FilePath
cabal = "extensions.cabal"

unknownModule :: FilePath
unknownModule = "src/Unknown.hs"

knownModule :: FilePath
knownModule = "src/Extensions.hs"

knownSource :: IO ByteString
knownSource = fromMaybe "" . Map.lookup knownModule <$> sources