{-# LANGUAGE GeneralizedNewtypeDeriving, OverloadedStrings, TemplateHaskell #-}
module Main (main) where
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.HUnit
import Test.QuickCheck
import Web.Routes
import Web.Routes.TH
newtype ArticleId = ArticleId Int deriving (Eq, Show, Num, PathInfo, Arbitrary)
data Sitemap
= Home
| Article ArticleId
deriving (Eq, Show)
derivePathInfo ''Sitemap
instance Arbitrary Sitemap where
arbitrary = oneof [return Home, fmap Article arbitrary]
prop_PathInfo_isomorphism :: Sitemap -> Bool
prop_PathInfo_isomorphism = pathInfoInverse_prop
case_toPathInfo :: Assertion
case_toPathInfo =
do toPathInfo Home @?= "/home"
toPathInfo (Article 0) @?= "/article/0"
case_fromPathInfo :: Assertion
case_fromPathInfo =
do fromPathInfo "/home" @?= Right Home
fromPathInfo "/article/0" @?= Right (Article 0)
case fromPathInfo "/" :: Either String Sitemap of
Left _ -> return ()
url -> assertFailure $ "expected a Left, but got: " ++ show url
main :: IO ()
main = hspec $ do
prop "toPathInfo" case_toPathInfo
prop "fromPathInfo" case_fromPathInfo
prop "PathInfo_isomorphism" prop_PathInfo_isomorphism