import qualified Control.Monad as Monad
import qualified Data.List as List
import qualified Language.Haskell.Brittany.Main as Brittany
import qualified System.Directory as Directory
import qualified System.FilePath as FilePath
import qualified Test.Hspec as Hspec

main :: IO ()
main = Hspec.hspec . Hspec.parallel $ do
  let directory = "data"
  entries <- Hspec.runIO $ Directory.listDirectory directory
  Monad.forM_ (List.sort entries) $ \entry ->
    case FilePath.stripExtension "hs" entry of
      Nothing -> pure ()
      Just slug -> Hspec.it slug $ do
        let input = FilePath.combine directory entry
        expected <- readFile input
        let output = FilePath.combine "output" entry
        Directory.copyFile input output
        Brittany.mainWith
          "brittany"
          [ "--config-file"
          , FilePath.combine directory "brittany.yaml"
          , "--no-user-config"
          , "--write-mode"
          , "inplace"
          , output
          ]
        actual <- readFile output
        Literal actual `Hspec.shouldBe` Literal expected

newtype Literal
  = Literal String
  deriving Eq

instance Show Literal where
  show (Literal x) = x