jsonlogic-0.1.0.0: test/Generator/Utils.hs
module Generator.Utils where
import Hedgehog
import Hedgehog.Gen
import qualified Hedgehog.Gen as Gen
import Hedgehog.Range as Range
-- | Splits size object into two uneven sizes
genUnbalancedSizes :: Size -> Gen (Size, Size)
genUnbalancedSizes (Size size) = do
balanceOffset <- int $ Range.constant (negate size) size
let s1 = Size $ (size + balanceOffset) `div` 2
s2 = Size $ (size - balanceOffset) `div` 2
return (s1, s2)
-- | Generates a list of uneven sizes
genUnbalancedSizeList :: Size -> Gen [Size]
genUnbalancedSizeList (Size size) = do
-- On average contain ~5 items
arrayLength <- int $ Range.constant 1 10
let elementSize = size `div` arrayLength
(Size <$>) <$> genUnbalancedIntList size elementSize
-- | Create an unequal list of integers
genUnbalancedIntList ::
-- | How many items are still remaining to get divided
Int ->
-- | The maximum size of a single entry in the list
Int ->
-- | A randomly generated list of integers
Gen [Int]
genUnbalancedIntList remaining maxInt
| remaining <= 0 = return []
| otherwise = do
chunkSize <- int $ Range.constant 0 $ min remaining maxInt
-- Important! -1 so the size of each element will converge to 0 eventually
(:) chunkSize <$> genUnbalancedIntList (remaining - chunkSize - 1) maxInt
increaseSizeBy :: Int -> Gen a -> Gen a
increaseSizeBy i = Gen.scale (\(Size s) -> Size $ s + i)