blockchain-0.0.3: test/ArbitraryInstances.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
module ArbitraryInstances
( MediumWord(..)
) where
import Test.QuickCheck
import Test.QuickCheck.Instances ()
import qualified Crypto.PubKey.ECC.ECDSA as Crypto
import qualified Crypto.PubKey.ECC.Types as Crypto
import qualified Data.ByteString.Char8 as BS
import Data.Monoid ((<>))
import qualified Data.Word as Word
import Data.Blockchain
-- Blockchain types
instance Arbitrary BlockchainConfig where
arbitrary = BlockchainConfig
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary Block where
arbitrary = Block
<$> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary BlockHeader where
arbitrary = BlockHeader
<$> arbitrary
<*> arbitrary
<*> arbitrary
<*> (hashTreeRoot <$> arbitrary)
<*> arbitrary
<*> arbitrary
<*> arbitrary
instance Arbitrary CoinbaseTransaction where
arbitrary = CoinbaseTransaction <$> arbitrary
instance Arbitrary Transaction where
arbitrary = resize 5 $ Transaction <$> arbitrary <*> arbitrary
instance Arbitrary TransactionIn where
arbitrary = resize 5 $ TransactionIn <$> arbitrary <*> arbitrary
instance Arbitrary TransactionOut where
arbitrary = resize 5 $ TransactionOut <$> arbitrary <*> arbitrary
instance Arbitrary TransactionOutRef where
arbitrary = TransactionOutRef <$> arbitrary <*> arbitrary
instance Arbitrary Difficulty where
arbitrary = Difficulty <$> arbitrary
-- Crypto Types
instance Arbitrary (Hash a) where
arbitrary = unsafeFromByteString . BS.pack <$> vectorOf 64 hexChar
where
hexChar = elements $ ['0' .. '9'] <> ['a' .. 'f']
instance Arbitrary Signature where
arbitrary = Signature <$> arbitrarySig
where
arbitrarySig = Crypto.Signature
<$> arbitraryPositive
<*> arbitraryPositive
instance Arbitrary PublicKey where
arbitrary = PublicKey <$> arbitraryPoint
where
arbitraryPoint = Crypto.Point
<$> arbitraryPositive
<*> arbitraryPositive
instance Arbitrary PrivateKey where
arbitrary = PrivateKey <$> arbitraryPositive
-- Other Types
instance Arbitrary Hex256 where
arbitrary = Hex256 <$> arbitrary
newtype MediumWord = MediumWord Word.Word deriving (Eq, Show)
instance Arbitrary MediumWord where
arbitrary = elements $ MediumWord <$> [0..1000]
-- Utils
arbitraryPositive :: (Num a, Ord a, Arbitrary a) => Gen a
arbitraryPositive = getPositive <$> arbitrary