packages feed

haskoin-0.1.0: tests/Network/Haskoin/Protocol/Arbitrary.hs

{-|
  This package provides QuickCheck Arbitrary instances for all the protocol
  data types defined in 'Network.Haskoin.Protocol'.
-}
module Network.Haskoin.Protocol.Arbitrary () where

import Test.QuickCheck
import Network.Haskoin.Crypto.Arbitrary()

import Control.Monad
import Control.Applicative 

import qualified Data.Sequence as S (fromList)

import Network.Haskoin.Protocol
import Network.Haskoin.Crypto

instance Arbitrary VarInt where
    arbitrary = VarInt <$> arbitrary

instance Arbitrary VarString where
    arbitrary = VarString <$> arbitrary

instance Arbitrary NetworkAddress where
    arbitrary = do
        s <- arbitrary
        a <- liftM2 (,) arbitrary arbitrary
        p <- arbitrary
        return $ NetworkAddress s a p

instance Arbitrary InvType where
    arbitrary = elements [InvError, InvTx, InvBlock, InvMerkleBlock]

instance Arbitrary InvVector where
    arbitrary = InvVector <$> arbitrary <*> (hash256 <$> arbitrary)

instance Arbitrary Inv where
    arbitrary = Inv <$> listOf arbitrary

instance Arbitrary Version where
    arbitrary = Version <$> arbitrary
                        <*> arbitrary
                        <*> arbitrary
                        <*> arbitrary
                        <*> arbitrary
                        <*> arbitrary
                        <*> arbitrary
                        <*> arbitrary
                        <*> arbitrary

instance Arbitrary Addr where
    arbitrary = Addr <$> listOf arbitrary

instance Arbitrary Alert where
    arbitrary = Alert <$> arbitrary <*> arbitrary

instance Arbitrary Reject where
    arbitrary = Reject <$> arbitrary <*> arbitrary <*> arbitrary

instance Arbitrary RejectCode where
    arbitrary = elements [ RejectMalformed
                         , RejectInvalid
                         , RejectInvalid
                         , RejectDuplicate
                         , RejectNonStandard
                         , RejectDust
                         , RejectInsufficientFee
                         , RejectCheckpoint
                         ]

instance Arbitrary BlockHeader where
    arbitrary = BlockHeader <$> arbitrary
                            <*> (fromIntegral . hash256 <$> arbitrary)
                            <*> (hash256 <$> arbitrary)
                            <*> arbitrary
                            <*> arbitrary
                            <*> arbitrary
                            
instance Arbitrary Tx where
    arbitrary = do
        v   <- arbitrary
        tin <- do 
            l <- choose (0,10)
            vectorOf l arbitrary
        tout <- do
            l <- choose (0,10)
            vectorOf l arbitrary
        t    <- arbitrary
        return $ Tx v tin tout t

instance Arbitrary CoinbaseTx where
    arbitrary = CoinbaseTx <$> arbitrary
                           <*> (return $ OutPoint 0 0xffffffff)
                           <*> arbitrary
                           <*> (return $ 0xffffffff)
                           <*> (listOf arbitrary)
                           <*> arbitrary

instance Arbitrary TxIn where
    arbitrary = TxIn <$> arbitrary
                     <*> arbitrary
                     <*> arbitrary

instance Arbitrary TxOut where
    arbitrary = TxOut <$> (choose (0,2100000000000000))
                      <*> arbitrary

instance Arbitrary OutPoint where
    arbitrary = OutPoint <$> arbitrary
                         <*> arbitrary

instance Arbitrary Block where
    arbitrary = do
        h <- arbitrary
        c <- arbitrary
        t <- do 
            l <- choose (0,10)
            vectorOf l arbitrary
        return $ Block h c t

instance Arbitrary MerkleBlock where
    arbitrary = do
        h <- arbitrary
        ntx <- arbitrary
        hashes <- arbitrary
        c <- choose (1,10)
        flags <- vectorOf (c*8) arbitrary
        return $ MerkleBlock h ntx hashes flags

instance Arbitrary GetBlocks where
    arbitrary = GetBlocks <$> arbitrary
                          <*> (listOf arbitrary)
                          <*> arbitrary

instance Arbitrary GetData where
    arbitrary = GetData <$> (listOf arbitrary)

instance Arbitrary GetHeaders where
    arbitrary = GetHeaders <$> arbitrary
                           <*> (listOf arbitrary)
                           <*> arbitrary

instance Arbitrary Headers where
    arbitrary = Headers <$> (listOf (liftM2 (,) arbitrary arbitrary))

instance Arbitrary NotFound where
    arbitrary = NotFound <$> (listOf arbitrary)

instance Arbitrary Ping where
    arbitrary = Ping <$> arbitrary

instance Arbitrary Pong where
    arbitrary = Pong <$> arbitrary

instance Arbitrary MessageCommand where
    arbitrary = elements [ MCVersion
                         , MCVerAck
                         , MCAddr
                         , MCInv
                         , MCGetData
                         , MCNotFound
                         , MCGetBlocks
                         , MCGetHeaders
                         , MCTx
                         , MCBlock
                         , MCMerkleBlock
                         , MCHeaders
                         , MCGetAddr
                         , MCFilterLoad
                         , MCFilterAdd
                         , MCFilterClear
                         , MCPing
                         , MCPong
                         , MCAlert
                         ]

instance Arbitrary MessageHeader where
    arbitrary = MessageHeader <$> arbitrary
                              <*> arbitrary
                              <*> arbitrary
                              <*> arbitrary

instance Arbitrary Message where
    arbitrary = oneof [ MVersion    <$> arbitrary
                      , return MVerAck
                      , MAddr        <$> arbitrary
                      , MInv         <$> arbitrary
                      , MGetData     <$> arbitrary
                      , MNotFound    <$> arbitrary
                      , MGetBlocks   <$> arbitrary
                      , MGetHeaders  <$> arbitrary
                      , MTx          <$> arbitrary
                      , MBlock       <$> arbitrary
                      , MMerkleBlock <$> arbitrary
                      , MHeaders     <$> arbitrary
                      , return MGetAddr
                      , MFilterLoad  <$> arbitrary
                      , MFilterAdd   <$> arbitrary
                      , return MFilterClear
                      , MPing        <$> arbitrary
                      , MPong        <$> arbitrary
                      , MAlert       <$> arbitrary
                      ]

instance Arbitrary BloomFlags where
    arbitrary = elements [ BloomUpdateNone
                         , BloomUpdateAll
                         , BloomUpdateP2PubKeyOnly
                         ]

instance Arbitrary BloomFilter where
    arbitrary = BloomFilter <$> (S.fromList <$> arbitrary)
                            <*> arbitrary
                            <*> arbitrary
                            <*> arbitrary
                        
instance Arbitrary FilterLoad where
    arbitrary = FilterLoad <$> arbitrary

instance Arbitrary FilterAdd where
    arbitrary = FilterAdd <$> arbitrary