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