content: module Test.Parse.ExtensionsSpec where
  
  
  import System.FilePath
  import Language.Haskell.Exts.Extension
  
  import Test.Hspec
  import Test.Utilities
  
  import Language.Haskell.Homplexity.Parse
  import Language.Haskell.Homplexity.CabalFiles
  
  
  spec :: Spec
  spec = describe "extensions support" $ do
      it "must parse language pragma in file" $
          parseSource [] (testFile "test0001.hs") >>= (`shouldSatisfy` isRight)
      it "can parse language pragmas in file" $
          parseSource [] (testFile "test0001.hs") >>= (`shouldSatisfy` isRight)
      it "can't parse without language pragmas in file" $
          parseSource [] (testFile "test0002.hs") >>= (`shouldSatisfy` isLeft)
      it "can parse with additional pragmas" $
          parseSource [EnableExtension ScopedTypeVariables] (testFile "test0002.hs") >>= (`shouldSatisfy` isRight)
      it "pragmas in file must override additional pragmas" $
          parseSource [DisableExtension ScopedTypeVariables] (testFile "test0001.hs") >>= (`shouldSatisfy` isRight)
      it "disabling must works as disabling" $
          parseSource [DisableExtension ScopedTypeVariables] (testFile "test0002.hs") >>= (`shouldSatisfy` isLeft)
      -- * Testing for cabal file processing
      it "must extract language extensions from library from cabal" $
          parseCabalFile (testFile "test0003.cabal")
          >>= return . languageExtensions Library . fromRight (error "Can't parse test cabal file")
          >>= (`shouldBe` [EnableExtension FlexibleContexts,
                           EnableExtension FlexibleInstances,
                           EnableExtension UndecidableInstances,
                           EnableExtension OverlappingInstances])
      it "extract language extensions from package from cabal" $
          parseCabalFile (testFile "test0003.cabal")
          >>= return . languageExtensions (Package "test01") . fromRight (error "Can't parse test cabal file")
          >>= (`shouldBe` [EnableExtension DeriveDataTypeable,
                           EnableExtension RecordWildCards])
  
  
  -- * Code from Data.Either --
  -- Not supported by earlier 'base' package
  
  isRight :: Either a b -> Bool
  isRight (Right _) = True
  isRight _ = False
  
  
  isLeft :: Either a b -> Bool
  isLeft (Left _) = True
  isLeft _ = False
  
  
  fromRight :: b -> Either a b -> b
  fromRight _ (Right b) = b
  fromRight def _ = def
  
  
  -- fromLeft :: a -> Either a b -> a
  -- fromLeft _ (Left a) = a
  -- fromLeft def _ = def
  
  