{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
import Debug.Trace
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck (Arbitrary (..))
import qualified Data.Ascii as A
import Network.HTTP.Types
import Data.Text (Text)
import qualified Data.ByteString as S
import qualified Data.Text as T
main :: IO ()
main = hspec $ descriptions
[ describe "encode/decode path"
[ it "is identity to encode and then decode"
$ property propEncodeDecodePath
]
, describe "encode/decode query"
[ it "is identity to encode and then decode"
$ property propEncodeDecodeQuery
]
, describe "encode/decode path segments"
[ it "is identity to encode and then decode"
$ property propEncodeDecodePathSegments
]
]
propEncodeDecodePath :: ([Text], Query) -> Bool
propEncodeDecodePath (p', q') =
let x = A.toByteString $ A.fromAsciiBuilder $ encodePath a b
y = decodePath x
z = y == (a, b)
in if z then z else traceShow (a, b, x, y) z
where
a = if p' == [""] then [] else p'
b = filter (\(x, _) -> not (S.null x)) q'
propEncodeDecodeQuery :: Query -> Bool
propEncodeDecodeQuery q' =
q == parseQuery (A.toByteString $ renderQuery True q)
where
q = filter (\(x, _) -> not (S.null x)) q'
propEncodeDecodePathSegments :: [Text] -> Bool
propEncodeDecodePathSegments p' =
p == decodePathSegments (A.toByteString $ A.fromAsciiBuilder $ encodePathSegments p)
where
p = if p' == [""] then [] else p'
instance Arbitrary Text where
arbitrary = fmap T.pack arbitrary
instance Arbitrary S.ByteString where
arbitrary = fmap S.pack arbitrary