hfmt-0.0.1.0: src/Language/Haskell/Format/Utilities.hs
module Language.Haskell.Format.Utilities (wasReformatted, hunitTest, defaultFormatter) where
import Language.Haskell.Format
import Language.Haskell.Format.Definitions
import Language.Haskell.Source.Enumerator
import Control.Applicative
import Control.Monad
import Data.Monoid
import Pipes
import qualified Pipes.Prelude as P
import Test.HUnit
type ErrorString = String
data CheckResult = InvalidCheckResult ErrorString
| CheckResult HaskellSource Reformatted
hunitTest :: FilePath -> Test
hunitTest filepath = TestLabel filepath $ makeTestCase filepath
makeTestCase :: FilePath -> Test
makeTestCase filepath = TestCase $ do
formatter <- defaultFormatter
runEffect $ check formatter filepath >-> assertResults
assertResults :: Consumer CheckResult IO ()
assertResults = forever $ do
result <- await
case result of
(InvalidCheckResult errorString) -> lift $ assertFailure ("Error: " ++ errorString)
(CheckResult source reformatted) -> when (wasReformatted source reformatted) $ lift $ assertFailure
("Incorrect formatting: " ++ concatMap
show
(suggestions
reformatted))
check :: Formatter -> FilePath -> Producer CheckResult IO ()
check formatter path = enumeratePath path >->
P.mapM readSource >->
P.map (checkFormatting formatter)
readSource :: HaskellSourceFilePath -> IO HaskellSource
readSource path = HaskellSource <$> readFile path
checkFormatting :: Formatter -> HaskellSource -> CheckResult
checkFormatting (Formatter format) source =
case format source of
Left error -> InvalidCheckResult error
Right reformatted -> CheckResult source reformatted
fix :: Formatter -> FilePath -> IO ()
fix = undefined
defaultFormatter :: IO Formatter
defaultFormatter = mconcat <$> (autoSettings >>= formatters)
wasReformatted :: HaskellSource -> Reformatted -> Bool
wasReformatted source reformatted =
not (null (suggestions reformatted)) || source /= reformattedSource reformatted