path-0.5.13: test/ValidityTest.hs
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- | Test suite.
module Main where
import Control.Applicative
import Control.Monad
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as LBS
import Data.Maybe
import Path
import Path.Internal
import Test.Hspec
import Test.QuickCheck
import Test.Validity
import Path.Gen
-- | Test suite entry point, returns exit failure if any test fails.
main :: IO ()
main = hspec spec
-- | Test suite.
spec :: Spec
spec = parallel $ do
describe "Parsing: Path Abs Dir" (parserSpec parseAbsDir)
describe "Parsing: Path Rel Dir" (parserSpec parseRelDir)
describe "Parsing: Path Abs File" (parserSpec parseAbsFile)
describe "Parsing: Path Rel File" (parserSpec parseRelFile)
describe "Operations: (</>)" operationAppend
describe "Operations: stripDir" operationStripDir
describe "Operations: isParentOf" operationIsParentOf
describe "Operations: parent" operationParent
describe "Operations: filename" operationFilename
-- | The 'filename' operation.
operationFilename :: Spec
operationFilename = do
it "filename ($(mkAbsDir parent) </> $(mkRelFile filename)) == filename $(mkRelFile filename)" $
forAllShrink genValid shrinkValidAbsDir $ \parent ->
forAllShrink genValid shrinkValidRelFile $ \file ->
filename (parent </> file) `shouldBe` filename file
it "filename ($(mkRelDir parent) </> $(mkRelFile filename)) == filename $(mkRelFile filename)" $
forAllShrink genValid shrinkValidRelDir $ \parent ->
forAllShrink genValid shrinkValidRelFile $ \file ->
filename (parent </> file) `shouldBe` filename file
it "produces a valid path on when passed a valid absolute path" $ do
producesValidsOnValids (filename @Abs)
it "produces a valid path on when passed a valid relative path" $ do
producesValidsOnValids (filename @Rel)
-- | The 'parent' operation.
operationParent :: Spec
operationParent = do
it "produces a valid path on when passed a valid file path" $ do
producesValidsOnValids (parent @File)
it "produces a valid path on when passed a valid directory path" $ do
producesValidsOnValids (parent @Dir)
-- | The 'isParentOf' operation.
operationIsParentOf :: Spec
operationIsParentOf = do
it "isParentOf parent (parent </> child)" $
forAllShrink genValid shrinkValidAbsDir $ \parent ->
forAllShrink genValid shrinkValidRelFile $ \child ->
isParentOf parent (parent </> child)
it "isParentOf parent (parent </> child)" $
forAllShrink genValid shrinkValidAbsDir $ \parent ->
forAllShrink genValid shrinkValidRelDir $ \child ->
isParentOf parent (parent </> child)
it "isParentOf parent (parent </> child)" $
forAllShrink genValid shrinkValidRelDir $ \parent ->
forAllShrink genValid shrinkValidRelFile $ \child ->
isParentOf parent (parent </> child)
it "isParentOf parent (parent </> child)" $
forAllShrink genValid shrinkValidRelDir $ \parent ->
forAllShrink genValid shrinkValidRelDir $ \child ->
isParentOf parent (parent </> child)
-- | The 'stripDir' operation.
operationStripDir :: Spec
operationStripDir = do
it "stripDir parent (parent </> child) = child" $
forAllShrink genValid shrinkValidAbsDir $ \parent ->
forAllShrink genValid shrinkValidRelFile $ \child ->
stripDir parent (parent </> child) == Just child
it "stripDir parent (parent </> child) = child" $
forAllShrink genValid shrinkValidRelDir $ \parent ->
forAllShrink genValid shrinkValidRelFile $ \child ->
stripDir parent (parent </> child) == Just child
it "stripDir parent (parent </> child) = child" $
forAllShrink genValid shrinkValidAbsDir $ \parent ->
forAllShrink genValid shrinkValidRelDir $ \child ->
stripDir parent (parent </> child) == Just child
it "stripDir parent (parent </> child) = child" $
forAllShrink genValid shrinkValidRelDir $ \parent ->
forAllShrink genValid shrinkValidRelDir $ \child ->
stripDir parent (parent </> child) == Just child
it "produces a valid path on when passed a valid absolute file paths" $ do
producesValidsOnValids2 (stripDir @Maybe @Abs @File)
it "produces a valid path on when passed a valid absolute directory paths" $ do
producesValidsOnValids2 (stripDir @Maybe @Abs @Dir)
it "produces a valid path on when passed a valid relative file paths" $ do
producesValidsOnValids2 (stripDir @Maybe @Rel @File)
it "produces a valid path on when passed a valid relative directory paths" $ do
producesValidsOnValids2 (stripDir @Maybe @Rel @Dir)
-- | The '</>' operation.
operationAppend :: Spec
operationAppend = do
it "produces a valid path on when creating valid absolute file paths" $ do
producesValidsOnValids2 ((</>) @Abs @File)
it "produces a valid path on when creating valid absolute directory paths" $ do
producesValidsOnValids2 ((</>) @Abs @Dir)
it "produces a valid path on when creating valid relative file paths" $ do
producesValidsOnValids2 ((</>) @Rel @File)
it "produces a valid path on when creating valid relative directory paths" $ do
producesValidsOnValids2 ((</>) @Rel @Dir)
parserSpec :: (Show p, Validity p) => (FilePath -> Maybe p) -> Spec
parserSpec parser =
it "Produces valid paths when it succeeds" $
validIfSucceedsOnGen parser genFilePath