1 {-# LANGUAGE ConstraintKinds #-}
2 {-# LANGUAGE OverloadedStrings #-}
3 {-# LANGUAGE RankNTypes #-}
4 {-# LANGUAGE UndecidableInstances #-}
9 import Network.URI.Slug
12 import Test.Tasty.HUnit
14 import Examples.Ex01 qualified as Ex01
27 [ Node (LayoutNodeSlug Ex01.Index ["index.html"]) []
28 , Node (LayoutNodeSlug Ex01.About ["about.html"]) []
29 , Node (LayoutNodeSlug (Ex01.Contact "<user>") ["<user>", "contact.html"]) []
33 , Ex01.Contact "<user>"
38 [ testCoderIsomorphism "Ex01" Ex01.site
45 [ (Ex01.Index, ["index.html"])
46 , (Ex01.About, ["about.html"])
56 {-expected-} (Forest (LayoutNode a)) ->
59 testLayouter tn site expectedLayout expectedRoutes =
60 let lay = layouter site
63 [ testCase "TreeLayout" $ layout lay @?= expectedLayout
64 , testCase "ReachableRoutes" $ usedRoutes lay @?= expectedRoutes
67 testCoderIsomorphism ::
71 (forall repr. Testable repr => repr a) ->
73 testCoderIsomorphism tn site =
78 [ (testCase "decode . encode" $ decode site (encode site a) @?= Right a)
79 , (testCase "encode . decode" $ encode site <$> decode site slugs @?= Right slugs)
82 (show <$> [1 :: Int ..])
83 (zip (usedRoutes site) (usedSlugs site))
85 testDecoder :: (Eq a, Show a) => String -> Decoder a -> [(a, [Slug])] -> TestTree
86 testDecoder tn site as =
89 (\n (expected, slugs) -> testCase n $ decode site slugs @?= Right expected)
90 (show <$> [1 :: Int ..])
93 testEncoder :: String -> Encoder a -> [(a, [Slug])] -> TestTree
94 testEncoder tn site as =
97 (\n (a, expected) -> testCase n $ encode site a @?= expected)
98 (show <$> [1 :: Int ..])