gibberish-3.0.0.0: testlib/Test/Gibberish/Gen.hs
module Test.Gibberish.Gen
( trigraph,
digram,
unigram,
frequencies,
frequency,
word,
genPasswordOpts,
genPassphraseOpts,
stdGen,
) where
import Data.Gibberish.Types
import Control.Monad.Random (StdGen (), mkStdGen)
import Data.Text (Text ())
import Hedgehog
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range
trigraph :: Gen Trigraph
trigraph = do
Trigraph <$> Gen.map (Range.linear 0 250) kv
where
kv = (,) <$> digram <*> frequencies
digram :: Gen Digram
digram = Digram <$> Gen.unicode <*> Gen.unicode
unigram :: Gen Unigram
unigram = Unigram <$> Gen.unicode
frequencies :: Gen Frequencies
frequencies =
Frequencies
<$> Gen.map (Range.linear 0 25) kv
where
kv = (,) <$> unigram <*> frequency
frequency :: Gen Frequency
frequency = Frequency <$> Gen.int (Range.linear 0 maxBound)
word :: Gen Text
word = Gen.text (Range.linear 3 30) $ Gen.enum 'a' 'e'
genPasswordOpts :: Gen GenPasswordOpts
genPasswordOpts =
GenPasswordOpts
<$> Gen.bool
<*> Gen.bool
<*> Gen.bool
<*> trigraph
<*> Gen.int (Range.linear 0 15)
genPassphraseOpts :: Gen GenPassphraseOpts
genPassphraseOpts = do
minLen <- Gen.int (Range.linear 0 10)
maxLen <- Gen.int (Range.linear minLen 15)
GenPassphraseOpts
<$> Gen.bool
<*> Gen.bool
<*> Gen.bool
<*> trigraph
<*> pure minLen
<*> pure maxLen
stdGen :: Gen StdGen
stdGen = mkStdGen <$> Gen.integral (Range.linear minBound maxBound)