packages feed

easy-file-0.2.6: test/Test.hs

{-# LANGUAGE CPP #-}

module Main where

import Control.Exception (bracket)
import System.EasyFile
import System.IO
import Test.Tasty
import Test.Tasty.HUnit

main :: IO ()
main =
    defaultMain $
        testGroup
            "easy-file"
            [ testCase "path" testPath
            , testCase "setFileSize" testSetFileSize
            , testCase "hasSubDirectories" testHasSubDirectories
            , testCase "metadata of a file open for writing" testOpenForWriting
            ]

testPath :: Assertion
testPath = do
    assertEqual
        "Test that '/' is path separator"
        ("foo" </> "bar")
        "foo/bar"

    isRelative "foo" @?= True

    isRelative "/foo" @?= isWindows

    isRelative "c:foo" @?= True

    isRelative "c:/foo" @?= not isWindows

-- The file must not be left open: getting its size and removing it work.
testSetFileSize :: Assertion
testSetFileSize = withTempDir "setFileSize" $ \dir -> do
    let file = dir </> "file"
    writeFile file "0123456789"
    setFileSize file 4
    getFileSize file >>= (@?= 4)
    setFileSize file 16
    getFileSize file >>= (@?= 16)
    removeFile file

testHasSubDirectories :: Assertion
testHasSubDirectories = withTempDir "hasSubDirectories" $ \dir -> do
    createDirectory $ dir </> "sub"
    r <- hasSubDirectories dir
    if isWindows || isMac
        then r @?= Nothing
        else r @?= Just True

testOpenForWriting :: Assertion
testOpenForWriting = withTempDir "openForWriting" $ \dir -> do
    let file = dir </> "file"
    withFile file WriteMode $ \h -> do
        hPutStr h "0123456789" >> hFlush h
        _ <- getModificationTime file
        _ <- getAccessTime file
        getFileSize file >>= (@?= 10)

withTempDir :: String -> (FilePath -> IO a) -> IO a
withTempDir name = bracket setup removeDirectoryRecursive
  where
    setup = do
        tmp <- getTemporaryDirectory
        let dir = tmp </> ("easy-file-test-" ++ name)
        exist <- doesDirectoryExist dir
        if exist then removeDirectoryRecursive dir else return ()
        createDirectory dir
        return dir

isWindows :: Bool
#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
isWindows = True
#else
isWindows = False
#endif

isMac :: Bool
#ifdef darwin_HOST_OS
isMac = True
#else
isMac = False
#endif