{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} module HUnits where import Relude import Symantic qualified as Sym import Test.Tasty import Test.Tasty.HUnit import Examples.Ex01 qualified as Ex01 import Examples.Ex02 qualified as Ex02 import Literate.Web import Text.Printf (printf) import Utils test :: TestTree test = testGroup "HUnits" [ testGroup "Generator" [ testGenerator "Ex01" Ex01.site [ ( () , [ Gen ["index.html"] $ Ex01.Index , Gen ["about.html"] $ Ex01.About -- , Gen ["user", "contact.html"] $ Ex01.Contact "user" -- , Gen ["post"] $ Ex01.Post [] -- , Gen ["post", "dir"] $ Ex01.Post ["dir"] -- , Gen ["post", "dir", "dir"] $ Ex01.Post ["dir", "dir"] ] ) ] , testGenerator "Ex02" Ex02.site [ ( Ex02.model0 , [Gen{genSlugs = ["static"], genValue = Ex02.SiteStatic}, Gen{genSlugs = ["feed"], genValue = Ex02.SiteFeeds}, Gen{genSlugs = ["filter", "all"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Nothing, filterTag = Nothing})}, Gen{genSlugs = ["filter", "all", "tag0"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Nothing, filterTag = Just (Ex02.Tag{unTag = "tag0"})})}, Gen{genSlugs = ["filter", "all", "tag1"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Nothing, filterTag = Just (Ex02.Tag{unTag = "tag1"})})}, Gen{genSlugs = ["filter", "fr"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Just Ex02.LangEn, filterTag = Nothing})}, Gen{genSlugs = ["filter", "fr", "tag0"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Just Ex02.LangEn, filterTag = Just (Ex02.Tag{unTag = "tag0"})})}, Gen{genSlugs = ["filter", "fr", "tag1"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Just Ex02.LangEn, filterTag = Just (Ex02.Tag{unTag = "tag1"})})}, Gen{genSlugs = ["filter", "en"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Just Ex02.LangFr, filterTag = Nothing})}, Gen{genSlugs = ["filter", "en", "tag0"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Just Ex02.LangFr, filterTag = Just (Ex02.Tag{unTag = "tag0"})})}, Gen{genSlugs = ["filter", "en", "tag1"], genValue = Ex02.SiteFilter (Ex02.Filter{filterLang = Just Ex02.LangFr, filterTag = Just (Ex02.Tag{unTag = "tag1"})})}] ) ] ] , testGroup "CoderIsomorphism" [ testCoderIsomorphism "Ex01" Ex01.site () , testCoderIsomorphism "Ex02" Ex02.site Ex02.model0 ] , testGroup "Encoder" [ testEncoder "Ex01" Ex01.site [ ( () , [ Gen ["index.html"] $ Ex01.Index , Gen ["about.html"] $ Ex01.About -- , Gen ["user", "contact.html"] $ Ex01.Contact "user" -- , Gen ["post", "a", "b"] $ Ex01.Post ["a", "b"] ] ) ] ] , testGroup "Decoder" [ testDecoder "Ex01" Ex01.site [ ( () , [ Gen ["index.html"] $ Ex01.Index , Gen ["about.html"] $ Ex01.About -- , Gen ["user", "contact.html"] $ Ex01.Contact "user" -- , Gen ["post", "a", "b"] $ Ex01.Post ["a", "b"] ] ) ] , testDecoder "Ex02" Ex02.site [ ( Ex02.model0 , [ {- Gen ["static"] $ Ex02.SiteStatic , -} Gen ["filter", "all", "tag0"] $ Ex02.SiteFilter Ex02.Filter { Ex02.filterLang = Nothing , Ex02.filterTag = Just (Ex02.Tag "tag0") } ] ) ] ] ] testGenerator :: Eq a => Show a => String -> Sym.Reader model Generator a -> [(model, [Gen a])] -> TestTree testGenerator tn site models = testGroup tn [ testCase (printf "Model%02d" modelNum) do generate (Sym.unReader site model) @?= expectedGens | (modelNum, (model, expectedGens)) <- ol models ] testCoderIsomorphism :: Eq a => Show a => String -> (forall repr. Testable model repr => Sym.Reader model repr a) -> model -> TestTree testCoderIsomorphism tn site model = testGroup tn $ [ testGroup (printf "Request%d" urlNum) $ [ ( testCase "decode . encode" do decode @() decoder Request{requestSlugs = encode encoder genValue, requestBody = ""} >>= (@?= Right genValue) ) , ( testCase "encode . decode" do dec <- decode @() decoder Request{requestSlugs = genSlugs, requestBody = ""} encode encoder <$> dec @?= Right genSlugs ) ] | (urlNum, Gen{..}) <- ol $ generate (Sym.unReader site model) ] where decoder = Sym.unReader site model encoder = Sym.unReader site model testDecoder :: Eq a => Show a => String -> Sym.Reader model (Decoder ()) a -> [(model, [Gen a])] -> TestTree testDecoder tn site models = testGroup tn [ testGroup (printf "Model%d" modelNum) [ testCase (printf "Gen%d" genNum) do decode (Sym.unReader site model) Request{requestSlugs = genSlugs, requestBody = ""} >>= (@?= Right genValue) | (genNum, Gen{..}) <- ol expectedGens ] | (modelNum, (model, expectedGens)) <- ol models ] testEncoder :: String -> Sym.Reader model Encoder a -> [(model, [Gen a])] -> TestTree testEncoder tn site models = testGroup tn [ testGroup (printf "Model%d" modelNum) [ testCase (printf "Gen%d" genNum) do encode (Sym.unReader site model) genValue @?= genSlugs | (genNum, Gen{..}) <- ol expectedGens ] | (modelNum, (model, expectedGens)) <- ol models ]