import Data.URI.Auth.Host (printURIAuthHost, parseURIAuthHost)
import Data.URI.Auth (printURIAuth, parseURIAuth)
import Data.URI (printURI, parseURI)
import Data.Text (Text)
import qualified Data.Text as T
import Data.Attoparsec.Text (Parser, parseOnly)
import Test.Tasty (testGroup, defaultMain)
import qualified Test.Tasty.QuickCheck as Q
import Test.QuickCheck.Property (Result, succeeded, failed)
import System.IO.Unsafe (unsafePerformIO)
main :: IO ()
main = defaultMain $ testGroup "URI tests"
[ Q.testProperty "URIAuthHost" (parsePrintIso printURIAuthHost parseURIAuthHost)
, Q.testProperty "URIAuth" (parsePrintIso printURIAuth parseURIAuth)
, Q.testProperty "URI" (parsePrintIso printURI parseURI)
]
parsePrintIso :: Eq a => Show a => (a -> Text) -> Parser a -> a -> Result
parsePrintIso print' parser x = case parseOnly parser (print' x) of
Left e ->
let go = unsafePerformIO $ do
putStr "Original value: "
print x
putStr "Printed Text: "
putStrLn $ T.unpack $ print' x
putStr "Parse Error: "
print e
in seq go failed
Right y
| y == x -> succeeded
| otherwise ->
let go = unsafePerformIO $ do
putStr "Original value: "
print x
putStr "Printed Text: "
putStrLn $ T.unpack $ print' x
putStr "Parsed Value: "
print y
in seq go failed