packages feed

shaker-0.4: testsuite/tests/Shaker/IoTest.hs

module Shaker.IoTest
 where

import Shaker.Io
import Shaker.Type
import System.Time
import Data.List
import Test.HUnit hiding (assert)

aTimeDiff :: TimeDiff
aTimeDiff = TimeDiff { tdYear = 0, tdMonth = 0, tdDay = 0, tdHour =0, tdMin=0, tdSec = -1, tdPicosec =0 }

modifyFileInfoClock :: FileInfo -> FileInfo
modifyFileInfoClock (FileInfo fp cl) = FileInfo fp (addToClockTime aTimeDiff cl)

defaultFileListenInfo :: FileListenInfo
defaultFileListenInfo = FileListenInfo "src" [] [] 

type ExpectedFiles = [FilePath]
type PresentFiles = [FilePath]

abstractHunitTestListFiles :: FileListenInfo -> (PresentFiles -> ExpectedFiles -> Bool) -> IO Bool
abstractHunitTestListFiles fli predicat = do 
  normal_list <- listFiles fli{ignore= []}
  res <- listFiles fli
  return $ predicat normal_list res

type ModifyFileInfo = [FileInfo] -> [FileInfo]
type Predicat = [FileInfo] -> [FileInfo] ->Bool

abstractTestModifiedFiles :: FileListenInfo -> ModifyFileInfo -> Predicat -> IO Bool
abstractTestModifiedFiles fli proc predicat= do
     curList <- getCurrentFpCl fli 
     (_,newList) <- listModifiedAndCreatedFiles [fli] (proc curList)
     return $ predicat curList newList 

testListFiles :: Assertion
testListFiles =  do 
  res <- abstractHunitTestListFiles defaultFileListenInfo (\_ b -> length b > 2 )
  res  @? "should have more than 2 files in src/"

testListFilesWithIgnoreAll :: Assertion
testListFilesWithIgnoreAll =  do 
  res <- abstractHunitTestListFiles defaultFileListenInfo {ignore=[".*"]} (\_ b -> b == [] )
  res  @? "List with ignore all should return an empty list"

testListFilesWithIgnore :: Assertion
testListFilesWithIgnore =  do
  res <-  abstractHunitTestListFiles defaultFileListenInfo {ignore=["\\.$"]} (\a b -> length a  ==length b + 2)
  res @? "ignore of \\.$ should exclude only . and .."

testListFilesWithIncludeAll :: Assertion
testListFilesWithIncludeAll =  do 
  res <- abstractHunitTestListFiles defaultFileListenInfo {include=[".*"]} (\a b->length a == length b)
  res @? "inclue of .* should should list all files"

testListModifiedFiles :: Assertion
testListModifiedFiles =  do
  res <- abstractTestModifiedFiles defaultFileListenInfo (map modifyFileInfoClock) (\a b -> length a == length b)
  res @? "all modified files should be listed "

testListCreatedFiles :: Assertion
testListCreatedFiles =  do
  res <- abstractTestModifiedFiles defaultFileListenInfo init (\_ b -> length b==1)
  res @? "a created file should be listed "

testListModifiedAndCreatedFiles :: Assertion
testListModifiedAndCreatedFiles =  do
  res <- abstractTestModifiedFiles defaultFileListenInfo (map modifyFileInfoClock . init) (\a b -> length a == length b)
  res @? "should list modified and created files"

testRecurseListFiles :: Assertion
testRecurseListFiles =  
  recurseListFiles (FileListenInfo "." ["\\.$"] []) >>= \res ->
  any ("IoTest.hs" `isSuffixOf`) res @? "Should contains IoTest.hs file "++show res
  
testListHsFiles :: Assertion
testListHsFiles = 
  recurseListFiles (FileListenInfo "." [] [".*\\.hs$"]) >>= \res ->
  all (".hs" `isSuffixOf`) res @?  "Should only contains hs files " ++ show res
    
testIsFileContainingMain :: Assertion
testIsFileContainingMain =  do
  res <- isFileContainingMain "prog/Shaker.hs" 
  res @? "File Shaker.hs should contain main methods" 

testIsFileNotContainingMain :: Assertion
testIsFileNotContainingMain =  do
  res <- isFileContainingMain "src/Shaker/Config.hs"
  not res @? "File Config.hs should not contain main methods" 

testIsFileConductorNotContainingMain :: Assertion
testIsFileConductorNotContainingMain =  do
  res <- isFileContainingMain "src/Shaker/Conductor.hs"
  not res @?  "File Config.hs should not contain main methods"