{-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE InstanceSigs #-} {-# LANGUAGE FlexibleContexts #-} {-# OPTIONS_GHC -Wall -fno-warn-orphans #-} #if __GLASGOW_HASKELL__ >= 805 {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE QuantifiedConstraints #-} {-# LANGUAGE TypeInType #-} #endif import qualified Data.Foldable as Foldable import Data.Proxy (Proxy(..)) #if !(MIN_VERSION_base(4,11,0)) import Data.Monoid ((<>)) #endif import Control.Monad.Zip (MonadZip) import Control.Monad (MonadPlus) import Data.Primitive.Array.Maybe import Data.Primitive.SmallArray.Maybe import GHC.Exts (IsList(..)) #if __GLASGOW_HASKELL__ < 805 import Data.Functor.Classes #endif import Test.Tasty (defaultMain,testGroup,TestTree) import Test.QuickCheck (Arbitrary,Arbitrary1,Gen) import qualified Test.Tasty.QuickCheck as TQC import qualified Test.QuickCheck as QC import qualified Test.QuickCheck.Classes as QCC main :: IO () main = do defaultMain $ testGroup "properties" [ testGroup "MaybeArray" $ lawsToTest <$> maybeArrayLaws , testGroup "SmallMaybeArray" $ lawsToTest <$> smallMaybeArrayLaws ] makeArrayLaws :: forall (f :: * -> *) a. #if __GLASGOW_HASKELL__ >= 805 ((forall a. Eq a => Eq (f a)), (forall a. Ord a => Ord (f a))) => ((forall a. Show a => Show (f a)), (forall a. Arbitrary a => Arbitrary (f a))) => ((forall a. IsList (f a)), Arbitrary (Item (f a)), Show (Item (f a))) => ((forall a. Read a => Read (f a))) => (Eq a, Arbitrary a, Show a, Ord a, Monoid (f a), Read (f a)) => (MonadPlus f, MonadZip f, Traversable f) #else ((Eq1 f, Ord1 f, Show1 f, Arbitrary1 f)) => (MonadPlus f, MonadZip f, Traversable f) => (Read (f a), Show (Item (f a)), Monoid (f a), Ord (f a), Arbitrary (f a), Show (f a)) => (IsList (f a), Show (Item (f a)), Arbitrary (Item (f a))) #endif => Proxy f -> Proxy (f a) -> [QCC.Laws] makeArrayLaws pf pfa = [ QCC.eqLaws pfa , QCC.ordLaws pfa , QCC.monoidLaws pfa -- , QCC.showReadLaws pfa , QCC.isListLaws pfa , QCC.functorLaws pf , QCC.alternativeLaws pf , QCC.applicativeLaws pf , QCC.foldableLaws pf , QCC.monadLaws pf , QCC.monadPlusLaws pf , QCC.monadZipLaws pf , QCC.traversableLaws pf ] maybeArrayLaws :: [QCC.Laws] maybeArrayLaws = makeArrayLaws proxyM1 proxyM smallMaybeArrayLaws :: [QCC.Laws] smallMaybeArrayLaws = makeArrayLaws proxyS1 proxyS proxyM :: Proxy (MaybeArray Int) proxyM = Proxy proxyM1 :: Proxy MaybeArray proxyM1 = Proxy proxyS :: Proxy (SmallMaybeArray Int) proxyS = Proxy proxyS1 :: Proxy SmallMaybeArray proxyS1 = Proxy lawsToTest :: QCC.Laws -> TestTree lawsToTest (QCC.Laws name pairs) = testGroup name (map (uncurry TQC.testProperty) pairs) instance Arbitrary1 MaybeArray where liftArbitrary :: forall a. Gen a -> Gen (MaybeArray a) liftArbitrary elemGen = fmap fromList (QC.liftArbitrary elemGen :: Gen [a]) liftShrink :: forall a. (a -> [a]) -> MaybeArray a -> [MaybeArray a] liftShrink shrf m = fmap maybeArrayFromList (fmap shrf (Foldable.toList m)) instance Arbitrary a => Arbitrary (MaybeArray a) where arbitrary = QC.arbitrary1 shrink = QC.shrink1 instance Arbitrary1 SmallMaybeArray where liftArbitrary :: forall a. Gen a -> Gen (SmallMaybeArray a) liftArbitrary elemGen = fmap fromList (QC.liftArbitrary elemGen :: Gen [a]) liftShrink :: forall a. (a -> [a]) -> SmallMaybeArray a -> [SmallMaybeArray a] liftShrink shrf m = fmap smallMaybeArrayFromList (fmap shrf (Foldable.toList m)) instance Arbitrary a => Arbitrary (SmallMaybeArray a) where arbitrary = QC.arbitrary1 shrink = QC.shrink1