{-# LANGUAGE
OverloadedStrings
#-}
module Main where
import Data.Attoparsec.Text
import Data.Attoparsec.Path
import qualified Data.Text as T
import Data.Monoid
import Test.QuickCheck
import Test.QuickCheck.Instances
import Unsafe.Coerce
newtype RelFile = RelFile String
deriving (Show)
instance Arbitrary RelFile where
arbitrary = do
xs <- arbitrary
pure $ RelFile $
if T.length xs > 0
then let xs' = if T.last xs == '/'
then xs <> "a"
else xs
xs'' = if T.head xs' == '/'
then "a" <> xs'
else xs'
in T.unpack xs''
else "foo"
newtype AbsFile = AbsFile String
deriving (Show)
instance Arbitrary AbsFile where
arbitrary = do
RelFile xs <- arbitrary
pure $ AbsFile $ "/" ++ xs
newtype RelDir = RelDir String
deriving (Show)
instance Arbitrary RelDir where
arbitrary = do
RelFile xs <- arbitrary
pure $ RelDir $ xs ++ "/"
newtype AbsDir = AbsDir String
deriving (Show)
instance Arbitrary AbsDir where
arbitrary = do
RelDir xs <- arbitrary
pure $ AbsDir $ "/" ++ xs
main :: IO ()
main = do
quickCheck $ \(RelFile x) -> parseOnly (relFilePath <* endOfInput) (T.pack x) == Right (unsafeCoerce x)
quickCheck $ \(AbsFile x) -> parseOnly (absFilePath <* endOfInput) (T.pack x) == Right (unsafeCoerce x)
quickCheck $ \(RelDir x) -> parseOnly (relDirPath <* endOfInput) (T.pack x) == Right (unsafeCoerce x)
quickCheck $ \(AbsDir x) -> parseOnly (absDirPath <* endOfInput) (T.pack x) == Right (unsafeCoerce x)
quickCheck $ \(RelFile x) -> case parseOnly (relFilePath <* endOfInput) (T.pack x <> "/") of
Left _ -> True
_ -> False
quickCheck $ \(RelFile x) -> case parseOnly (absFilePath <* endOfInput) (T.pack x <> "/") of
Left _ -> True
_ -> False
quickCheck $ \(RelFile x) -> case parseOnly (relDirPath <* endOfInput) (T.pack x) of
Left _ -> True
_ -> False
quickCheck $ \(RelFile x) -> case parseOnly (absDirPath <* endOfInput) (T.pack x) of
Left _ -> True
_ -> False