{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedStrings #-} module Test.Syd.Validity.LensSpec where import GHC.Generics (Generic) import Lens.Micro import Test.Syd import Test.Syd.Validity import Test.Syd.Validity.Lens spec :: Spec spec = do describe "lensSpec" $ do lensSpec ((_2) :: Lens (Int, Int) (Int, Int) Int Int) lensSpec ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) describe "lensSpecOnArbitrary" $ lensSpecOnArbitrary ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) describe "lensSpecOnGen" $ lensSpecOnGen ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) (abs <$> genValid) "positive valid doubles" (filter (0.0 >=) . shrinkValid) ((,) <$> (negate . abs <$> genValid) <*> (negate . abs <$> genValid)) "tuples of negative valid doubles" (const []) describe "lensGettingProducesValid" $ do it "holds for (_2) for ints" $ lensGettingProducesValid ((_2) :: Lens (Int, Int) (Int, Int) Int Int) it "holds for (_2) for doubles" $ lensGettingProducesValid ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) describe "lensGettingProducesValidOnArbitrary" $ it "holds for (_2) for doubles" $ lensGettingProducesValidOnArbitrary ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) describe "lensGettingProducesValidOnGen" $ it "holds for (_2) for special generators" $ lensGettingProducesValidOnGen ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) ((,) <$> (negate . abs <$> genValid) <*> (negate . abs <$> genValid)) (const []) describe "lensSettingProducesValid" $ do it "holds for (_2) for ints" $ lensSettingProducesValid ((_2) :: Lens (Int, Int) (Int, Int) Int Int) it "holds for (_2) for doubles" $ lensSettingProducesValid ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) describe "lensSettingProducesValidOnArbitrary" $ it "holds for (_2) for doubles" $ lensSettingProducesValidOnArbitrary ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) describe "lensSettingProducesValidOnGen" $ it "holds for (_2) for special generators" $ lensSettingProducesValidOnGen ((_2) :: Lens (Rational, Rational) (Rational, Rational) Rational Rational) (abs <$> genValid) (filter (0.0 >=) . shrinkValid) ((,) <$> (negate . abs <$> genValid) <*> (negate . abs <$> genValid)) (const []) describe "myBoolLens" $ lensSpec myBoolLens describe "myRationalLens" $ lensSpec myRationalLens data MyRecord = MyRecord { myBool :: Bool, myRational :: Rational } deriving (Show, Eq, Generic) instance Validity MyRecord instance GenValid MyRecord myBoolLens :: Lens' MyRecord Bool myBoolLens = lens myBool $ \mr b -> mr {myBool = b} myRationalLens :: Lens' MyRecord Rational myRationalLens = lens myRational $ \mr r -> mr {myRational = r}