content: {-# LANGUAGE TemplateHaskell #-}
  
  -- | Tests for @importify file@ command.
  
  module Test.File
         ( spec
         ) where
  
  import           Universum
  
  import           Data.List      (sort)
  import           Path           (Abs, Dir, File, Path, Rel, dirname, fileExtension,
                                   filename, fromRelDir, fromRelFile, fromAbsFile, mkRelFile,
                                   (-<.>), (</>))
  import           Path.IO        (listDir)
  import           System.Wlog    (Severity)
  
  import           Test.Hspec     (Spec, describe, it, runIO, shouldBe, xit)
  
  import           Importify.Main (importifyFileContent)
  import           Importify.Path (testDataPath)
  
  spec :: Spec
  spec = do
      (testFolders, _) <- runIO $ listDir testDataPath
      describe "file:unused" $
          mapM_ (makeTestGroup . (testDataPath </> ) . dirname) testFolders
  
  
  makeTestGroup :: Path Rel Dir -> Spec
  makeTestGroup testCasesPath = do
      (_, testDirPaths) <- runIO $ listDir testCasesPath
      let testHsOnly     = sort
                         $ filter ((== ".hs") . fileExtension) testDirPaths
  
      describe ("subfolder: " ++ fromRelDir (dirname testCasesPath)) $
          mapM_ makeTest testHsOnly
  
  makeTest :: Path Abs File -> Spec
  makeTest testCasePath = do
      (result, expected) <- runIO $ loadTestData testCasePath
      let testType = if filename testCasePath `elem` pendingTests then xit else it
      testType (fromRelFile $ filename testCasePath) $ result `shouldBe` expected
  
  pendingTests :: [Path Rel File]
  pendingTests = [ $(mkRelFile "01-ImportBothUsedQualified.hs") -- Importify can't modify source yet
                 ]
  
  loadTestData :: Path Abs File -> IO (Text, Text)
  loadTestData testCasePath = do
      goldenExamplePath <- testCasePath -<.> ".golden"
  
      goldenExampleSrc     <- readFile (fromAbsFile goldenExamplePath)
      Right importifiedSrc <- importifyFileContent testCasePath
  
      return (importifiedSrc, goldenExampleSrc)
  