{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
import Data.List (sort)
import Spec.Listing
import Test.Hspec --(anyException, context, hspec, it, shouldThrow)
import System.IO.Error (isPermissionError)
import System.Posix.ByteString.FilePath (RawFilePath)
import qualified Data.ByteString as BS
import qualified System.Posix.Recursive as String
import qualified System.Posix.Recursive.ByteString as ByteString
import qualified System.Posix.Recursive.ByteString.Unsafe as UnsafeBS
import qualified System.Posix.Recursive.Unsafe as Unsafe
-- Helper
isSuffixOf :: String -> String -> Bool
isSuffixOf needle haystack
| needleLen > hayLen = False
| otherwise = needle == drop (hayLen - needleLen) haystack
where
needleLen = length needle
hayLen = length haystack
instance DirectoryListing FilePath where
list = String.list
followList = String.followList
listMatching = String.listMatching
followListMatching = String.followListMatching
listAccessible = String.listAccessible
listDirectories = String.listDirectories
listRegularFiles = String.listRegularFiles
listSymbolicLinks = String.listSymbolicLinks
listCustom filterPath includeFile =
String.listCustom
String.defConf
{ String.filterPath = filterPath
, String.includeFile = includeFile
}
instance DirectoryListing RawFilePath where
list = ByteString.list
followList = ByteString.followList
listMatching = ByteString.listMatching
followListMatching = ByteString.followListMatching
listDirectories = ByteString.listDirectories
listAccessible = ByteString.listAccessible
listRegularFiles = ByteString.listRegularFiles
listSymbolicLinks = ByteString.listSymbolicLinks
listCustom filterPath includeFile =
ByteString.listCustom
ByteString.defConf
{ ByteString.filterPath = filterPath
, ByteString.includeFile = includeFile
}
main :: IO ()
main =
hspec $ do
context "System.Posix.Recursive" $ spec isSuffixOf
context "System.Posix.Recursive.Unsafe" $
it "should throw" $ do
let exp = do
res <- Unsafe.list "test/workdir"
print $ length res
exp `shouldThrow` isPermissionError
context "System.Posix.Recursive.ByteString" $ spec BS.isSuffixOf
context "System.Posix.Recursive.ByteString.Unsafe" $
it "should throw" $ do
let exp = do
res <- UnsafeBS.list "test/workdir"
print $ length res
exp `shouldThrow` isPermissionError