packages feed

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

module Shaker.IoTest
 where

import Shaker.Io
import System.Time
import Data.List
import Test.QuickCheck 
import Test.QuickCheck.Monadic 
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)

abstractTestListFiles :: FileListenInfo -> ([FilePath] -> [FilePath] -> Bool) -> Property
abstractTestListFiles fli predicat = monadicIO action
  where action = do
               lstFile <- run $ listFiles fli{ignore= []}
               r <- run $listFiles fli
               assert $ predicat lstFile r 

prop_listFiles :: FileListenInfo -> Property
prop_listFiles fli = abstractTestListFiles fli{ignore=[]} (\_ b -> length b>2)

prop_listFilesWithIgnoreAll :: FileListenInfo -> Property
prop_listFilesWithIgnoreAll fli = abstractTestListFiles fli{ignore= [".*"], include=[]} (\_ b -> b==[])

prop_listFilesWithIgnore :: FileListenInfo -> Property
prop_listFilesWithIgnore fli = abstractTestListFiles fli{ignore= ["\\.$"], include=[]} (\a b-> length a == length b + 2)

prop_listFilesWithIncludeAll :: FileListenInfo -> Property
prop_listFilesWithIncludeAll fli = abstractTestListFiles fli{include=[".*"]} (\a b->length a >= length b)

testModifiedFiles :: FileListenInfo -> ([FileInfo] -> [FileInfo]) -> ([FileInfo] -> [FileInfo] ->Bool) -> Property
testModifiedFiles fli proc predicat= monadicIO action
  where action = do 
               curList <- run $ getCurrentFpCl fli 
               (_,newList) <- run $ listModifiedAndCreatedFiles [fli] (proc curList)
               assert $ predicat curList newList 

prop_listModifiedFiles :: FileListenInfo -> Property
prop_listModifiedFiles fli = 
  testModifiedFiles fli (map modifyFileInfoClock) (\a b -> length a == length b)

prop_listCreatedFiles :: FileListenInfo -> Property
prop_listCreatedFiles fli = 
  testModifiedFiles fli init (\_ b -> length b==1)

prop_listModifiedAndCreatedFiles :: FileListenInfo -> Property
prop_listModifiedAndCreatedFiles fli = 
  testModifiedFiles fli (map modifyFileInfoClock . init) (\a b -> length a == length b)

testRecurseListFiles :: Test
testRecurseListFiles = TestCase $ 
  recurseListFiles (FileListenInfo "." ["\\.$"] []) >>= \res ->
  assertBool ("Should contains IoTest.hs file "++show res) $
    any ("IoTest.hs" `isSuffixOf`) res
  
testListFiles :: Test
testListFiles = TestCase $ 
  listFiles (FileListenInfo "." [] []) >>= \res ->
  assertBool ("Should contains src dir"++show res) $
    any ("src" `isSuffixOf`) res
  
testListHsFiles :: Test
testListHsFiles = TestCase $
  recurseListFiles (FileListenInfo "." [] [".*\\.hs$"]) >>= \res ->
  assertBool ("Should only contains hs files " ++ show res) $
    all (".hs" `isSuffixOf`) res

testIsFileContainingMain :: Test
testIsFileContainingMain = TestCase $ do
  res <- isFileContainingMain "src/Shaker.hs" 
  assertBool "File Shaker.hs should contain main methods" res

testIsFileNotContainingMain :: Test
testIsFileNotContainingMain = TestCase $ do
  res <- isFileContainingMain "src/Shaker/Config.hs"
  assertBool "File Config.hs should not contain main methods" $ not res