content: module CradleSpec where
  
  import Control.Applicative
  import Data.List (isSuffixOf)
  import GhcMod.Cradle
  import GhcMod.Types
  import System.Directory (canonicalizePath)
  import System.FilePath (pathSeparator)
  import Test.Hspec
  import TestUtils
  import Prelude
  
  import Dir
  
  clean_ :: IO Cradle -> IO Cradle
  clean_ f = do
    crdl <- f
    cleanupCradle crdl
    return crdl
  
  relativeCradle :: FilePath -> Cradle -> Cradle
  relativeCradle dir crdl = crdl {
      cradleCurrentDir    = toRelativeDir dir  $  cradleCurrentDir crdl
    , cradleRootDir       = toRelativeDir dir  $  cradleRootDir    crdl
    , cradleCabalFile     = toRelativeDir dir <$> cradleCabalFile  crdl
    }
  
  -- Work around GHC 7.2.2 where `canonicalizePath "/"` returns "/.".
  stripLastDot :: FilePath -> FilePath
  stripLastDot path
    | (pathSeparator:'.':"") `isSuffixOf` path = init path
    | otherwise = path
  
  spec :: Spec
  spec = do
      describe "findCradle" $ do
          it "returns the current directory" $ do
              withDirectory_ "/" $ do
                  curDir <- stripLastDot <$> canonicalizePath "/"
                  res <- clean_ $ runGmOutDef $ findCradleNoLog $ optPrograms defaultOptions
                  cradleCurrentDir res `shouldBe` curDir
                  cradleRootDir    res `shouldBe` curDir
                  cradleCabalFile  res `shouldBe` Nothing
  
          it "finds a cabal file and a sandbox" $ do
              withDirectory "test/data/cabal-project/subdir1/subdir2" $ \dir -> do
                  res <- relativeCradle dir <$> clean_ (runGmOutDef $ findCradleNoLog $ optPrograms defaultOptions)
  
                  cradleCurrentDir res `shouldBe`
                      "test/data/cabal-project/subdir1/subdir2"
  
                  cradleRootDir    res `shouldBe` "test/data/cabal-project"
  
                  cradleCabalFile  res `shouldBe`
                      Just ("test/data/cabal-project/cabalapi.cabal")
  
          it "works even if a sandbox config file is broken" $ do
              withDirectory "test/data/broken-sandbox" $ \dir -> do
                  res <- relativeCradle dir <$> clean_ (runGmOutDef $ findCradleNoLog $ optPrograms defaultOptions)
                  cradleCurrentDir res `shouldBe`
                      "test" </> "data" </> "broken-sandbox"
  
                  cradleRootDir    res `shouldBe`
                      "test" </> "data" </> "broken-sandbox"
  
                  cradleCabalFile  res `shouldBe`
                    Just ("test" </> "data" </> "broken-sandbox" </> "dummy.cabal")
  