{- |
Module      : Haskoin.Test.Message
Copyright   : No rights reserved
License     : MIT
Maintainer  : jprupp@protonmail.ch
Stability   : experimental
Portability : POSIX
-}
module Haskoin.Util.Arbitrary.Message where

import Haskoin.Data
import Haskoin.Network.Message
import Haskoin.Util.Arbitrary.Block
import Haskoin.Util.Arbitrary.Crypto
import Haskoin.Util.Arbitrary.Network
import Haskoin.Util.Arbitrary.Transaction
import Test.QuickCheck

-- | Arbitrary 'MessageHeader'.
arbitraryMessageHeader :: Gen MessageHeader
arbitraryMessageHeader :: Gen MessageHeader
arbitraryMessageHeader =
    Word32 -> MessageCommand -> Word32 -> CheckSum32 -> MessageHeader
MessageHeader forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Arbitrary a => Gen a
arbitrary
        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen MessageCommand
arbitraryMessageCommand
        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. Arbitrary a => Gen a
arbitrary
        forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen CheckSum32
arbitraryCheckSum32

-- | Arbitrary 'Message'.
arbitraryMessage :: Network -> Gen Message
arbitraryMessage :: Network -> Gen Message
arbitraryMessage Network
net =
    forall a. [Gen a] -> Gen a
oneof
        [ Version -> Message
MVersion forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Version
arbitraryVersion
        , forall (m :: * -> *) a. Monad m => a -> m a
return Message
MVerAck
        , Addr -> Message
MAddr forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Addr
arbitraryAddr1
        , Inv -> Message
MInv forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Inv
arbitraryInv1
        , GetData -> Message
MGetData forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen GetData
arbitraryGetData
        , NotFound -> Message
MNotFound forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen NotFound
arbitraryNotFound
        , GetBlocks -> Message
MGetBlocks forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen GetBlocks
arbitraryGetBlocks
        , GetHeaders -> Message
MGetHeaders forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen GetHeaders
arbitraryGetHeaders
        , Tx -> Message
MTx forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Network -> Gen Tx
arbitraryTx Network
net
        , Block -> Message
MBlock forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Network -> Gen Block
arbitraryBlock Network
net
        , MerkleBlock -> Message
MMerkleBlock forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen MerkleBlock
arbitraryMerkleBlock
        , Headers -> Message
MHeaders forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Headers
arbitraryHeaders
        , forall (m :: * -> *) a. Monad m => a -> m a
return Message
MGetAddr
        , FilterLoad -> Message
MFilterLoad forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen FilterLoad
arbitraryFilterLoad
        , FilterAdd -> Message
MFilterAdd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen FilterAdd
arbitraryFilterAdd
        , forall (m :: * -> *) a. Monad m => a -> m a
return Message
MFilterClear
        , Ping -> Message
MPing forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Ping
arbitraryPing
        , Pong -> Message
MPong forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Pong
arbitraryPong
        , Alert -> Message
MAlert forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Alert
arbitraryAlert
        , Reject -> Message
MReject forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Reject
arbitraryReject
        , forall (m :: * -> *) a. Monad m => a -> m a
return Message
MSendHeaders
        ]