Tests for foldable
This commit is contained in:
@ -1,6 +1,68 @@
|
||||
{-# LANGUAGE LambdaCase #-}
|
||||
{-# LANGUAGE TemplateHaskell #-}
|
||||
module Test.Data.Functor.Foldable where
|
||||
|
||||
import Hedgehog
|
||||
import qualified Hedgehog.Gen as Gen
|
||||
import qualified Hedgehog.Range as Range
|
||||
import Test.Tasty
|
||||
import Test.Tasty.Hedgehog
|
||||
|
||||
import Data.Eq.Deriving
|
||||
(deriveEq1)
|
||||
import Text.Show.Deriving
|
||||
(deriveShow1)
|
||||
|
||||
import Data.Functor.Foldable
|
||||
|
||||
data AST f
|
||||
= Addition f f
|
||||
| Value Int
|
||||
deriving stock (Functor, Eq, Show)
|
||||
|
||||
deriveShow1 ''AST
|
||||
deriveEq1 ''AST
|
||||
|
||||
evaluate :: AST Int -> Int
|
||||
evaluate = \case
|
||||
Addition a b -> a + b
|
||||
Value x -> x
|
||||
|
||||
render :: AST String -> String
|
||||
render = \case
|
||||
Addition a b -> a <> " + " <> b
|
||||
Value x -> show x
|
||||
|
||||
parse :: [String] -> AST [String]
|
||||
parse = \case
|
||||
a : "+" : b : xs -> Addition (a : xs) [b]
|
||||
[a] -> Value (read a)
|
||||
_ -> Value 0
|
||||
|
||||
genAST :: Gen (Fix AST)
|
||||
genAST = Gen.recursive Gen.choice
|
||||
[ Fix . Value <$> Gen.integral (Range.linear 0 100) ]
|
||||
[ Gen.subterm2 genAST genAST (\a b -> Fix (Addition a b))
|
||||
]
|
||||
|
||||
prop_parse_render_tripping :: Property
|
||||
prop_parse_render_tripping = property $ do
|
||||
x <- forAll genAST
|
||||
let rendered = cata render x
|
||||
parsed = ana parse . words $ rendered
|
||||
annotateShow rendered
|
||||
annotateShow parsed
|
||||
annotateShow $ cata evaluate x
|
||||
cata evaluate parsed === cata evaluate x
|
||||
|
||||
prop_parse_render_hylo :: Property
|
||||
prop_parse_render_hylo = property $ do
|
||||
x <- forAll genAST
|
||||
let rendered = cata render x
|
||||
hylo evaluate parse (words rendered) === cata evaluate x
|
||||
|
||||
tests :: TestTree
|
||||
tests = testGroup "Data.Functor.Foldable" []
|
||||
tests = testGroup "Data.Functor.Foldable"
|
||||
[ testProperty "cata and ana do reverse" $ prop_parse_render_tripping
|
||||
, testProperty "hylo do reverse" $ prop_parse_render_hylo
|
||||
]
|
||||
|
Reference in New Issue
Block a user