{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} module Main where import Data.Functor (void) import Control.Lens import Hedgehog import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range import Hedgehog.Checkers.Ugly.Function.Hack import Hedgehog.Checkers.Lens.Properties data Foo = Foo { _bar :: Int , _baz :: Int , _dunno :: String } deriving (Eq, Show) makeLenses ''Foo genFoo' :: Gen Int -> Gen String -> Gen Foo genFoo' gi gs = do i <- gi i' <- gi s <- gs return (Foo i i' s) genFoo :: Gen Foo genFoo = let string = Gen.string (Range.linear 0 100) Gen.ascii int = Gen.int (Range.linear 0 100) in genFoo' int string allLensLawsFoo :: Property allLensLawsFoo = property $ do let string = Gen.string (Range.linear 0 100) Gen.ascii int = Gen.int (Range.linear 0 100) isLens bar int genFoo (ordFuncWtf' int int) isLens baz int genFoo (ordFuncWtf' int int) isLens dunno string genFoo (ordFuncWtf' string string) main :: IO () main = do void $ checkParallel $ Group "Control.Lens.Lens" [ ("all laws applied to foo's lenses" , allLensLawsFoo) ]