packages feed

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)