module GenIP where import Hedgehog import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range import Data.Word import Data.List import Control.Monad import IPTypes genIP :: Gen IP genIP = IP <$> Gen.word32 Range.linearBounded genIPComponents :: Gen [Word8] genIPComponents = Gen.list (Range.singleton 4) genOctet where genOctet = Gen.word8 Range.linearBounded genIPString :: Gen String genIPString = intercalate "." . map show <$> genIPComponents genIPRange :: Gen IPRange genIPRange = do (IP ip1) <- genIP ip2 <- Gen.word32 (Range.linearFrom (ip1 + 1) ip1 (ip1 + mb ip1)) pure $ IPRange (IP ip1) (IP ip2) where maxRangeSize = 1000000 mb from = min (maxBound - from) maxRangeSize genInvalidIPRange :: Gen IPRange genInvalidIPRange = do (IP ip1) <- Gen.filter (> IP minBound) genIP ip2 <- Gen.word32 (Range.linear minBound (ip1 - 1)) pure $ IPRange (IP ip1) (IP ip2) genIPRangeDBSized :: Int -> Int -> Gen IPRangeDB genIPRangeDBSized minLen maxLen = IPRangeDB <$> Gen.list (Range.constant minLen maxLen) genIPRange genIPRangeDB :: Gen IPRangeDB genIPRangeDB = do n1 <- Gen.integral (Range.constant 1 100) n2 <- Gen.integral (Range.constant n1 100) genIPRangeDBSized n1 n2 genIPList :: Int -> IO [IP] genIPList n = Gen.sample $ Gen.list (Range.constant n n) genIP