path-0.7.0: test/Common.hs
{-# LANGUAGE TemplateHaskell #-}
-- | Test functions that are common to Posix and Windows
module Common (extensionOperations) where
import Control.Monad
import Path
import System.FilePath (pathSeparator)
import Test.Hspec
validExtensionsSpec :: String -> Path b File -> Path b File -> Spec
validExtensionsSpec ext file fext = do
let f = show $ toFilePath file
let fx = show $ toFilePath fext
it ("addExtension " ++ show ext ++ " " ++ f ++ " == " ++ fx) $
addExtension ext file `shouldReturn` fext
it ("fileExtension " ++ fx ++ " == " ++ ext) $
fileExtension fext `shouldReturn` ext
it ("replaceExtension " ++ show ext ++ " " ++ fx ++ " == " ++ fx) $
replaceExtension ext fext `shouldReturn` fext
extensionOperations :: String -> Spec
extensionOperations rootDrive = do
let ext = ".foo"
let extensions = ext : [".foo.", ".foo.."]
-- Only filenames and extensions
forM_ extensions (\x ->
forM_ filenames $ \f -> do
let Just file = parseRelFile f
let Just fext = parseRelFile (f ++ x)
(validExtensionsSpec x file fext))
-- Relative dir paths
forM_ dirnames (\d -> do
forM_ filenames (\f -> do
let f1 = d ++ [pathSeparator] ++ f
let Just file = parseRelFile f1
let Just fext = parseRelFile (f1 ++ ext)
validExtensionsSpec ext file fext))
-- Absolute dir paths
forM_ dirnames (\d -> do
forM_ filenames (\f -> do
let f1 = rootDrive ++ d ++ [pathSeparator] ++ f
let Just file = parseAbsFile f1
let Just fext = parseAbsFile (f1 ++ ext)
validExtensionsSpec ext file fext))
-- Invalid extensions
forM_ invalidExtensions $ \x -> do
it ("throws InvalidExtension when extension is [" ++ x ++ "]") $
addExtension x $(mkRelFile "name")
`shouldThrow` (== InvalidExtension x)
where
filenames =
[ "name"
, "name."
, "name.."
, ".name"
, "..name"
, "name.name"
, "name..name"
, "..."
]
dirnames = filenames ++ ["."]
invalidExtensions =
[ ""
, "."
, "x"
, ".."
, "..."
, "xy"
, "foo"
, "foo."
, "foo.."
, "..foo"
, "...foo"
, ".foo.bar"
, ".foo" ++ [pathSeparator] ++ "bar"
]