{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.Cardano.Ledger.Binary.Arbitrary (
  genVersion,
) where

import Cardano.Ledger.Binary.Version
import GHC.Stack
import Test.Cardano.Base.Arbitrary ()
import Test.Cardano.Binary.Arbitrary ()
import Test.Data.VMap.Arbitrary ()
import Test.QuickCheck
import Test.QuickCheck.Instances ()

instance Arbitrary Version where
  arbitrary :: Gen Version
arbitrary = HasCallStack => Version -> Version -> Gen Version
Version -> Version -> Gen Version
genVersion Version
forall a. Bounded a => a
minBound Version
forall a. Bounded a => a
maxBound

genVersion :: HasCallStack => Version -> Version -> Gen Version
genVersion :: HasCallStack => Version -> Version -> Gen Version
genVersion Version
minVersion Version
maxVersion =
  Word32 -> Word32 -> Gen Version
genVersion32 (Version -> Word32
getVersion32 Version
minVersion) (Version -> Word32
getVersion32 Version
maxVersion)
  where
    genVersion32 :: Word32 -> Word32 -> Gen Version
genVersion32 Word32
minVersion32 Word32
maxVersion32 = do
      v32 <- (Word32, Word32) -> Gen Word32
forall a. Random a => (a, a) -> Gen a
choose (Word32
minVersion32, Word32
maxVersion32)
      case mkVersion32 v32 of
        Maybe Version
Nothing -> [Char] -> Gen Version
forall a. HasCallStack => [Char] -> a
error ([Char] -> Gen Version) -> [Char] -> Gen Version
forall a b. (a -> b) -> a -> b
$ [Char]
"Impossible: Invalid version generated: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Word32 -> [Char]
forall a. Show a => a -> [Char]
show Word32
v32
        Just Version
v -> Version -> Gen Version
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Version
v