{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE Unsafe #-} {-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} module Test.Fold (tests) where import safe "base" Control.Category (Category (id)) import safe "base" Control.Monad ((=<<)) import safe "base" Data.Bool (Bool) import safe "base" Data.Function (($)) import safe "base" Data.Int (Int) import safe "base" Data.Proxy (Proxy (Proxy)) import safe "base" System.IO (IO) import safe "hedgehog" Hedgehog ( Property, checkParallel, discover, forAll, property, ) import safe qualified "hedgehog" Hedgehog.Gen as Gen import safe "yaya" Yaya.Fold (Mu, Nu) import safe "yaya" Yaya.Fold.Common (size) import safe "yaya" Yaya.Fold.Native (Cofix, Fix) import safe "yaya-hedgehog" Yaya.Hedgehog.Expr ( Expr, genCofixExpr, genExpr, genFixExpr, genMuExpr, genNuExpr, ) import safe "yaya-hedgehog" Yaya.Hedgehog.Fold ( corecursiveIsUnsafe, law_anaRefl, law_cataCancel, law_cataCompose, law_cataRefl, recursiveIsUnsafe, ) import safe qualified "yaya-unsafe" Yaya.Unsafe.Fold.Instances () -- TODO: For some reason HLint is complaining that TemplateHaskell is unused. {-# HLINT ignore "Unused LANGUAGE pragma" #-} prop_fixAnaRefl :: Property prop_fixAnaRefl = property $ law_anaRefl =<< forAll (Gen.sized genFixExpr) -- | NB: Only in yaya-unsafe instead of yaya because the `Eq (Cofix f)` instance -- is needed. prop_cofixAnaRefl :: Property prop_cofixAnaRefl = property $ law_anaRefl =<< forAll (Gen.sized genCofixExpr) prop_cofixCataCancel :: Property prop_cofixCataCancel = property $ law_cataCancel size =<< forAll (genExpr (Gen.sized genCofixExpr)) prop_cofixCataRefl :: Property prop_cofixCataRefl = property $ law_cataRefl =<< forAll (Gen.sized genCofixExpr) prop_cofixCataCompose :: Property prop_cofixCataCompose = property $ law_cataCompose (Proxy :: Proxy (Fix Expr)) size id =<< forAll (Gen.sized genCofixExpr) -- | NB: Only in yaya-unsafe instead of yaya because the `Eq (Nu f)` instance is -- needed. prop_nuAnaRefl :: Property prop_nuAnaRefl = property $ law_anaRefl =<< forAll (Gen.sized genNuExpr) prop_nuCataCancel :: Property prop_nuCataCancel = property $ law_cataCancel size =<< forAll (genExpr (Gen.sized genNuExpr)) prop_nuCataRefl :: Property prop_nuCataRefl = property $ law_cataRefl =<< forAll (Gen.sized genNuExpr) prop_nuCataCompose :: Property prop_nuCataCompose = property $ law_cataCompose (Proxy :: Proxy (Nu Expr)) size id =<< forAll (Gen.sized genNuExpr) prop_muAnaRefl :: Property prop_muAnaRefl = property $ law_anaRefl =<< forAll (Gen.sized genMuExpr) -- * These tests try to verify non-termination behavior. prop_muIsntCorecursive :: Property prop_muIsntCorecursive = corecursiveIsUnsafe (Proxy :: Proxy Mu) (1 :: Int) prop_nuIsntRecursive :: Property prop_nuIsntRecursive = recursiveIsUnsafe (Proxy :: Proxy Nu) (1 :: Int) -- TODO: Figure out why this hangs during compilation. -- prop_fixIsntCorecursive :: Property -- prop_fixIsntCorecursive = corecursiveIsUnsafe (Proxy :: Proxy Fix) (1 :: Int) prop_cofixIsntRecursive :: Property prop_cofixIsntRecursive = recursiveIsUnsafe (Proxy :: Proxy Cofix) (1 :: Int) tests :: IO Bool tests = checkParallel $$discover