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))