packages feed

cleveland-0.1.2: src/Hedgehog/Gen/Michelson.hs

-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

module Hedgehog.Gen.Michelson
  ( genInstrCallStack
  , genLetName
  , genSrcPos
  , genPos
  , genMText
  ) where

import Hedgehog (MonadGen)
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range (Range)
import Hedgehog.Range qualified as Range

import Morley.Michelson.ErrorPos (InstrCallStack(..), LetName(..), Pos(..), SrcPos(..))
import Morley.Michelson.Text (MText, maxBoundMChar, minBoundMChar, mkMText)

import Hedgehog.Range.Defaults

genInstrCallStack :: MonadGen m => m InstrCallStack
genInstrCallStack = InstrCallStack <$> genLetCallStack <*> genSrcPos
  where
    genLetCallStack = Gen.frequency
      [ (80, pure [])
      , (18, Gen.list (Range.singleton 1) $ genLetName def)
      , (2, Gen.list (Range.singleton 2) $ genLetName def)
      ]

genLetName :: MonadGen m => Range TinyLength -> m LetName
genLetName lenRange =
  LetName <$> Gen.text (unTinyLength <$> lenRange) Gen.unicodeAll

genSrcPos :: MonadGen m => m SrcPos
genSrcPos = SrcPos <$> genPos def <*> genPos def

genPos :: MonadGen m => Range.Range Pos -> m Pos
genPos range = Pos <$> Gen.word (unPos <$> range)

genMText :: MonadGen m => Range.Range Length -> m MText
genMText lenRange =
  unsafe . mkMText <$> Gen.text
    (unLength <$> lenRange)
    (Gen.enum (toEnum @Char minBoundMChar) (toEnum @Char maxBoundMChar))