module Test.Gen.General
( chooseNominalDiffTime
, chooseTime
, chooseFixed
, genMaybe
, genVectorOfRange
) where
import Internal.Prelude
import Test.QuickCheck (Gen, choose)
import Test.QuickCheck.Gen qualified as Gen
import Time
chooseNominalDiffTime
:: (NominalDiffTime, NominalDiffTime) -> Gen NominalDiffTime
chooseNominalDiffTime =
fmap secondsToNominalDiffTime
. chooseFixed
. both nominalDiffTimeToSeconds
chooseFixed :: (Fixed a, Fixed a) -> Gen (Fixed a)
chooseFixed = fmap MkFixed . Gen.choose . both (\(MkFixed x) -> x)
both :: (a -> b) -> (a, a) -> (b, b)
both f = bimap f f
chooseTime :: (UTCTime, UTCTime) -> Gen UTCTime
chooseTime (a, b) =
Gen.frequency
[ (1,) $ Gen.elements [a, b]
, (10,) $ do
d <- chooseNominalDiffTime (0, diffUTCTime b a)
Gen.elements [addUTCTime d a, addUTCTime (negate d) b]
]
genMaybe :: Gen a -> Gen (Maybe a)
genMaybe g = Gen.oneof [pure Nothing, Just <$> g]
genVectorOfRange :: (Int, Int) -> Gen a -> Gen [a]
genVectorOfRange (a, b) g = do
i <- choose (a, b)
Gen.vectorOf i g