packages feed

age-0.0.1.0: test/Test/Crypto/Age/Payload/Plaintext/Gen.hs

module Test.Crypto.Age.Payload.Plaintext.Gen
  ( genNormalPlaintextPayloadChunk
  , genFinalPlaintextPayloadChunk
  , genPlaintextPayloadChunk
  ) where

import Crypto.Age.Payload.Plaintext
  ( FinalPlaintextPayloadChunk
  , NormalPlaintextPayloadChunk
  , PlaintextPayloadChunk (..)
  , mkFinalPlaintextPayloadChunk
  , mkNormalPlaintextPayloadChunk
  , plaintextChunkSize
  )
import Hedgehog ( Gen )
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Prelude
import Test.Gen ( genByteArray )

genNormalPlaintextPayloadChunk :: Gen NormalPlaintextPayloadChunk
genNormalPlaintextPayloadChunk = do
  bs <- genByteArray (Range.singleton plaintextChunkSize)
  case mkNormalPlaintextPayloadChunk bs of
    Nothing -> fail "failed to generate a NormalPlaintextPayloadChunk"
    Just x -> pure x

genFinalPlaintextPayloadChunk :: Gen FinalPlaintextPayloadChunk
genFinalPlaintextPayloadChunk = do
  bs <-
    -- Tend more toward generating smaller chunks.
    Gen.frequency
      [ (1, genByteArray (Range.constant 256 plaintextChunkSize))
      , (30, genByteArray (Range.constant 0 256))
      ]
  case mkFinalPlaintextPayloadChunk bs of
    Nothing -> fail "failed to generate a FinalPlaintextPayloadChunk"
    Just x -> pure x

genPlaintextPayloadChunk :: Gen PlaintextPayloadChunk
genPlaintextPayloadChunk =
  -- Tend more toward generating smaller final chunks rather than full 64 KiB
  -- normal chunks.
  Gen.frequency
    [ (1, PlaintextPayloadChunkNormal <$> genNormalPlaintextPayloadChunk)
    , (30, PlaintextPayloadChunkFinal <$> genFinalPlaintextPayloadChunk)
    ]