-- |
-- 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.Crypto (Ctx)
import Haskoin.Network.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
    (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 a b. Gen (a -> b) -> Gen a -> Gen b
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 a b. Gen (a -> b) -> Gen a -> Gen b
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 a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen CheckSum32
arbitraryCheckSum32

-- | Arbitrary 'Message'.
arbitraryMessage :: Network -> Ctx -> Gen Message
arbitraryMessage :: Network -> Ctx -> Gen Message
arbitraryMessage Network
net Ctx
ctx =
  [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 a. a -> Gen a
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 -> Ctx -> Gen Tx
arbitraryTx Network
net Ctx
ctx,
      Block -> Message
MBlock (Block -> Message) -> Gen Block -> Gen Message
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Network -> Ctx -> Gen Block
arbitraryBlock Network
net Ctx
ctx,
      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 a. a -> Gen a
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 a. a -> Gen a
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 a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return Message
MSendHeaders
    ]