packages feed

haskell-formatter-1.0.0: testsuite/src/Language/Haskell/Formatter/Toolkit/FileTesting.hs

{-|
Description : Test data based on file trees
-}
module Language.Haskell.Formatter.Toolkit.FileTesting (fileTestForest) where
import qualified Control.Exception as Exception
import qualified Data.Map.Strict as Map
import qualified Data.Monoid as Monoid
import qualified Language.Haskell.Formatter.Internal.MapTree as MapTree
import qualified Language.Haskell.Formatter.Toolkit.FileTree as FileTree
import qualified Test.Tasty as Tasty

fileTestForest ::
               (Either Exception.IOException (Map.Map FilePath String) ->
                  [Tasty.TestTree])
                 -> FilePath -> IO [Tasty.TestTree]
fileTestForest = folderTestForest readFile

folderTestForest ::
                   Monoid.Monoid a =>
                   (FilePath -> IO a) ->
                     (Either Exception.IOException (Map.Map FilePath a) ->
                        [Tasty.TestTree])
                       -> FilePath -> IO [Tasty.TestTree]
folderTestForest create createTests rootFolder
  = do fileForest <- FileTree.collectFiles create rootFolder
       return . createTestForest $ MapTree.summarizeLeaves fileForest
  where createTestForest = testForest createTests

testForest ::
           (a -> [Tasty.TestTree]) ->
             MapTree.MapTree Tasty.TestName a -> [Tasty.TestTree]
testForest createTests (MapTree.Leaf value) = createTests value
testForest createTests (MapTree.Node forest)
  = Map.elems $ Map.mapWithKey testTree forest
  where testTree label = Tasty.testGroup label . testForest createTests