{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}
{-# LANGUAGE DeriveGeneric #-}
module Ouroboros.Network.Protocol.TxSubmission2.Test
( tests
, Tx (..)
, TxId (..)
) where
import Data.Bifunctor (second)
import Data.ByteString.Lazy (ByteString)
import Data.List (nub)
import Data.List.NonEmpty qualified as NonEmpty
import Data.Word (Word16)
import Control.Monad.Class.MonadAsync (MonadAsync)
import Control.Monad.Class.MonadST (MonadST)
import Control.Monad.Class.MonadThrow (MonadCatch)
import Control.Monad.IOSim
import Control.Monad.ST (runST)
import Control.Tracer (Tracer (..), nullTracer)
import Codec.Serialise (DeserialiseFailure, Serialise)
import Codec.Serialise qualified as Serialise (decode, encode)
import Network.TypedProtocol.Codec hiding (prop_codec)
import Network.TypedProtocol.Proofs
import Ouroboros.Network.Channel
import Ouroboros.Network.Driver.Simple (runConnectedPeersPipelined)
import Ouroboros.Network.Util.ShowProxy
import Ouroboros.Network.Protocol.TxSubmission2.Client
import Ouroboros.Network.Protocol.TxSubmission2.Codec
import Ouroboros.Network.Protocol.TxSubmission2.Direct
import Ouroboros.Network.Protocol.TxSubmission2.Examples
import Ouroboros.Network.Protocol.TxSubmission2.Server
import Ouroboros.Network.Protocol.TxSubmission2.Type
import Test.Data.CDDL (Any (..))
import Test.Ouroboros.Network.Testing.Utils (prop_codec_cborM,
prop_codec_valid_cbor_encoding, splits2, splits3)
import Control.DeepSeq
import GHC.Generics
import Test.QuickCheck as QC
import Test.QuickCheck.Instances.ByteString ()
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.QuickCheck (testProperty)
tests :: TestTree
tests :: TestTree
tests =
TestName -> [TestTree] -> TestTree
testGroup TestName
"Ouroboros.Network.Protocol"
[ TestName -> [TestTree] -> TestTree
testGroup TestName
"TxSubmission2"
[ TestName -> (TxSubmissionTestParams -> Bool) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"direct" TxSubmissionTestParams -> Bool
prop_direct
, TestName -> (TxSubmissionTestParams -> Bool) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"connect 1" TxSubmissionTestParams -> Bool
prop_connect1
, TestName -> (TxSubmissionTestParams -> [Bool] -> Bool) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"connect 2" TxSubmissionTestParams -> [Bool] -> Bool
prop_connect2
, TestName
-> (AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"codec" AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec
, TestName
-> (AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"codec id" AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_id
, TestName
-> (AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"codec 2-splits" AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_splits2
, TestName -> Property -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"codec 3-splits" (Property -> TestTree) -> Property -> TestTree
forall a b. (a -> b) -> a -> b
$ Int
-> (AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool)
-> Property
forall prop. Testable prop => Int -> prop -> Property
withMaxSuccess Int
30
AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_splits3
, TestName
-> (AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"codec cbor" AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_cbor
, TestName
-> (AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Property)
-> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"codec valid cbor" AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Property
prop_codec_valid_cbor
, TestName -> (TxSubmissionTestParams -> Bool) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"channel ST" TxSubmissionTestParams -> Bool
prop_channel_ST
, TestName -> (TxSubmissionTestParams -> Property) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"channel IO" TxSubmissionTestParams -> Property
prop_channel_IO
, TestName -> (TxSubmissionTestParams -> Property) -> TestTree
forall a. Testable a => TestName -> a -> TestTree
testProperty TestName
"pipe IO" TxSubmissionTestParams -> Property
prop_pipe_IO
]
]
newtype Tx = Tx TxId
deriving (Tx -> Tx -> Bool
(Tx -> Tx -> Bool) -> (Tx -> Tx -> Bool) -> Eq Tx
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Tx -> Tx -> Bool
== :: Tx -> Tx -> Bool
$c/= :: Tx -> Tx -> Bool
/= :: Tx -> Tx -> Bool
Eq, Int -> Tx -> ShowS
[Tx] -> ShowS
Tx -> TestName
(Int -> Tx -> ShowS)
-> (Tx -> TestName) -> ([Tx] -> ShowS) -> Show Tx
forall a.
(Int -> a -> ShowS) -> (a -> TestName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Tx -> ShowS
showsPrec :: Int -> Tx -> ShowS
$cshow :: Tx -> TestName
show :: Tx -> TestName
$cshowList :: [Tx] -> ShowS
showList :: [Tx] -> ShowS
Show, Gen Tx
Gen Tx -> (Tx -> [Tx]) -> Arbitrary Tx
Tx -> [Tx]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen Tx
arbitrary :: Gen Tx
$cshrink :: Tx -> [Tx]
shrink :: Tx -> [Tx]
Arbitrary, [Tx] -> Encoding
Tx -> Encoding
(Tx -> Encoding)
-> (forall s. Decoder s Tx)
-> ([Tx] -> Encoding)
-> (forall s. Decoder s [Tx])
-> Serialise Tx
forall s. Decoder s [Tx]
forall s. Decoder s Tx
forall a.
(a -> Encoding)
-> (forall s. Decoder s a)
-> ([a] -> Encoding)
-> (forall s. Decoder s [a])
-> Serialise a
$cencode :: Tx -> Encoding
encode :: Tx -> Encoding
$cdecode :: forall s. Decoder s Tx
decode :: forall s. Decoder s Tx
$cencodeList :: [Tx] -> Encoding
encodeList :: [Tx] -> Encoding
$cdecodeList :: forall s. Decoder s [Tx]
decodeList :: forall s. Decoder s [Tx]
Serialise, (forall x. Tx -> Rep Tx x)
-> (forall x. Rep Tx x -> Tx) -> Generic Tx
forall x. Rep Tx x -> Tx
forall x. Tx -> Rep Tx x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Tx -> Rep Tx x
from :: forall x. Tx -> Rep Tx x
$cto :: forall x. Rep Tx x -> Tx
to :: forall x. Rep Tx x -> Tx
Generic, Tx -> ()
(Tx -> ()) -> NFData Tx
forall a. (a -> ()) -> NFData a
$crnf :: Tx -> ()
rnf :: Tx -> ()
NFData)
instance ShowProxy Tx where
showProxy :: Proxy Tx -> TestName
showProxy Proxy Tx
_ = TestName
"Tx"
txId :: Tx -> TxId
txId :: Tx -> TxId
txId (Tx TxId
txid) = TxId
txid
newtype TxId = TxId Any
deriving (TxId -> TxId -> Bool
(TxId -> TxId -> Bool) -> (TxId -> TxId -> Bool) -> Eq TxId
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TxId -> TxId -> Bool
== :: TxId -> TxId -> Bool
$c/= :: TxId -> TxId -> Bool
/= :: TxId -> TxId -> Bool
Eq, Eq TxId
Eq TxId =>
(TxId -> TxId -> Ordering)
-> (TxId -> TxId -> Bool)
-> (TxId -> TxId -> Bool)
-> (TxId -> TxId -> Bool)
-> (TxId -> TxId -> Bool)
-> (TxId -> TxId -> TxId)
-> (TxId -> TxId -> TxId)
-> Ord TxId
TxId -> TxId -> Bool
TxId -> TxId -> Ordering
TxId -> TxId -> TxId
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TxId -> TxId -> Ordering
compare :: TxId -> TxId -> Ordering
$c< :: TxId -> TxId -> Bool
< :: TxId -> TxId -> Bool
$c<= :: TxId -> TxId -> Bool
<= :: TxId -> TxId -> Bool
$c> :: TxId -> TxId -> Bool
> :: TxId -> TxId -> Bool
$c>= :: TxId -> TxId -> Bool
>= :: TxId -> TxId -> Bool
$cmax :: TxId -> TxId -> TxId
max :: TxId -> TxId -> TxId
$cmin :: TxId -> TxId -> TxId
min :: TxId -> TxId -> TxId
Ord, Int -> TxId -> ShowS
[TxId] -> ShowS
TxId -> TestName
(Int -> TxId -> ShowS)
-> (TxId -> TestName) -> ([TxId] -> ShowS) -> Show TxId
forall a.
(Int -> a -> ShowS) -> (a -> TestName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TxId -> ShowS
showsPrec :: Int -> TxId -> ShowS
$cshow :: TxId -> TestName
show :: TxId -> TestName
$cshowList :: [TxId] -> ShowS
showList :: [TxId] -> ShowS
Show, Gen TxId
Gen TxId -> (TxId -> [TxId]) -> Arbitrary TxId
TxId -> [TxId]
forall a. Gen a -> (a -> [a]) -> Arbitrary a
$carbitrary :: Gen TxId
arbitrary :: Gen TxId
$cshrink :: TxId -> [TxId]
shrink :: TxId -> [TxId]
Arbitrary, [TxId] -> Encoding
TxId -> Encoding
(TxId -> Encoding)
-> (forall s. Decoder s TxId)
-> ([TxId] -> Encoding)
-> (forall s. Decoder s [TxId])
-> Serialise TxId
forall s. Decoder s [TxId]
forall s. Decoder s TxId
forall a.
(a -> Encoding)
-> (forall s. Decoder s a)
-> ([a] -> Encoding)
-> (forall s. Decoder s [a])
-> Serialise a
$cencode :: TxId -> Encoding
encode :: TxId -> Encoding
$cdecode :: forall s. Decoder s TxId
decode :: forall s. Decoder s TxId
$cencodeList :: [TxId] -> Encoding
encodeList :: [TxId] -> Encoding
$cdecodeList :: forall s. Decoder s [TxId]
decodeList :: forall s. Decoder s [TxId]
Serialise, (forall x. TxId -> Rep TxId x)
-> (forall x. Rep TxId x -> TxId) -> Generic TxId
forall x. Rep TxId x -> TxId
forall x. TxId -> Rep TxId x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TxId -> Rep TxId x
from :: forall x. TxId -> Rep TxId x
$cto :: forall x. Rep TxId x -> TxId
to :: forall x. Rep TxId x -> TxId
Generic, TxId -> ()
(TxId -> ()) -> NFData TxId
forall a. (a -> ()) -> NFData a
$crnf :: TxId -> ()
rnf :: TxId -> ()
NFData)
instance ShowProxy TxId where
showProxy :: Proxy TxId -> TestName
showProxy Proxy TxId
_ = TestName
"TxId"
type TestServer m = TxSubmissionServerPipelined TxId Tx m [Tx]
type TestClient m = TxSubmissionClient TxId Tx m ()
testServer :: Monad m
=> Tracer m (TraceEventServer TxId Tx)
-> TxSubmissionTestParams
-> TestServer m
testServer :: forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventServer TxId Tx)
-> TxSubmissionTestParams -> TestServer m
testServer Tracer m (TraceEventServer TxId Tx)
tracer
TxSubmissionTestParams {
testMaxUnacked :: TxSubmissionTestParams -> Positive (Small Word16)
testMaxUnacked = Positive (Small Word16
maxUnacked),
testMaxTxIdsToRequest :: TxSubmissionTestParams -> Positive (Small Word16)
testMaxTxIdsToRequest = Positive (Small Word16
maxTxIdsToRequest),
testMaxTxToRequest :: TxSubmissionTestParams -> Positive (Small Word16)
testMaxTxToRequest = Positive (Small Word16
maxTxToRequest)
} =
Tracer m (TraceEventServer TxId Tx)
-> (Tx -> TxId)
-> Word16
-> Word16
-> Word16
-> TxSubmissionServerPipelined TxId Tx m [Tx]
forall txid tx (m :: * -> *).
(Ord txid, Monad m) =>
Tracer m (TraceEventServer txid tx)
-> (tx -> txid)
-> Word16
-> Word16
-> Word16
-> TxSubmissionServerPipelined txid tx m [tx]
txSubmissionServer
Tracer m (TraceEventServer TxId Tx)
tracer Tx -> TxId
txId
Word16
maxUnacked Word16
maxTxIdsToRequest Word16
maxTxToRequest
testClient :: Monad m
=> Tracer m (TraceEventClient TxId Tx)
-> TxSubmissionTestParams
-> TestClient m
testClient :: forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventClient TxId Tx)
-> TxSubmissionTestParams -> TestClient m
testClient Tracer m (TraceEventClient TxId Tx)
tracer TxSubmissionTestParams {
testMaxUnacked :: TxSubmissionTestParams -> Positive (Small Word16)
testMaxUnacked = Positive (Small Word16
maxUnacked),
testTransactions :: TxSubmissionTestParams -> DistinctList Tx
testTransactions = DistinctList [Tx]
txs
} =
Tracer m (TraceEventClient TxId Tx)
-> (Tx -> TxId)
-> (Tx -> SizeInBytes)
-> Word16
-> [Tx]
-> TxSubmissionClient TxId Tx m ()
forall txid tx (m :: * -> *).
(Ord txid, Show txid, Monad m) =>
Tracer m (TraceEventClient txid tx)
-> (tx -> txid)
-> (tx -> SizeInBytes)
-> Word16
-> [tx]
-> TxSubmissionClient txid tx m ()
txSubmissionClient
Tracer m (TraceEventClient TxId Tx)
tracer Tx -> TxId
txId Tx -> SizeInBytes
forall {a} {p}. Num a => p -> a
txSize
Word16
maxUnacked
[Tx]
txs
where
txSize :: p -> a
txSize p
_ = a
500
prop_direct :: TxSubmissionTestParams -> Bool
prop_direct :: TxSubmissionTestParams -> Bool
prop_direct params :: TxSubmissionTestParams
params@TxSubmissionTestParams{DistinctList Tx
testTransactions :: TxSubmissionTestParams -> DistinctList Tx
testTransactions :: DistinctList Tx
testTransactions} =
(forall s. IOSim s ([Tx], ())) -> ([Tx], ())
forall a. (forall s. IOSim s a) -> a
runSimOrThrow
(TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
-> TxSubmissionClient TxId Tx (IOSim s) () -> IOSim s ([Tx], ())
forall txid tx (m :: * -> *) a b.
Monad m =>
TxSubmissionServerPipelined txid tx m a
-> TxSubmissionClient txid tx m b -> m (a, b)
directPipelined
(Tracer (IOSim s) (TraceEventServer TxId Tx)
-> TxSubmissionTestParams
-> TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventServer TxId Tx)
-> TxSubmissionTestParams -> TestServer m
testServer Tracer (IOSim s) (TraceEventServer TxId Tx)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer TxSubmissionTestParams
params)
(Tracer (IOSim s) (TraceEventClient TxId Tx)
-> TxSubmissionTestParams
-> TxSubmissionClient TxId Tx (IOSim s) ()
forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventClient TxId Tx)
-> TxSubmissionTestParams -> TestClient m
testClient Tracer (IOSim s) (TraceEventClient TxId Tx)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer TxSubmissionTestParams
params))
([Tx], ()) -> ([Tx], ()) -> Bool
forall a. Eq a => a -> a -> Bool
==
(DistinctList Tx -> [Tx]
forall a. DistinctList a -> [a]
fromDistinctList DistinctList Tx
testTransactions, ())
prop_connect1 :: TxSubmissionTestParams -> Bool
prop_connect1 :: TxSubmissionTestParams -> Bool
prop_connect1 params :: TxSubmissionTestParams
params@TxSubmissionTestParams{DistinctList Tx
testTransactions :: TxSubmissionTestParams -> DistinctList Tx
testTransactions :: DistinctList Tx
testTransactions} =
case (forall s.
IOSim s ([Tx], (), TerminalStates (TxSubmission2 TxId Tx)))
-> ([Tx], (), TerminalStates (TxSubmission2 TxId Tx))
forall a. (forall s. IOSim s a) -> a
runSimOrThrow
(Peer (TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
-> Peer
(TxSubmission2 TxId Tx) (FlipAgency 'AsServer) 'StInit (IOSim s) ()
-> IOSim s ([Tx], (), TerminalStates (TxSubmission2 TxId Tx))
forall ps (pr :: PeerRole) (st :: ps) (m :: * -> *) a b.
(Monad m, Protocol ps) =>
Peer ps pr st m a
-> Peer ps (FlipAgency pr) st m b -> m (a, b, TerminalStates ps)
connect
(PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
-> Peer (TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
forall ps (pr :: PeerRole) (st :: ps) (m :: * -> *) a.
Functor m =>
PeerPipelined ps pr st m a -> Peer ps pr st m a
forgetPipelined (PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
-> Peer (TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx])
-> PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
-> Peer (TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
forall a b. (a -> b) -> a -> b
$
TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
-> PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
forall txid tx (m :: * -> *) a.
Functor m =>
TxSubmissionServerPipelined txid tx m a
-> PeerPipelined (TxSubmission2 txid tx) 'AsServer 'StInit m a
txSubmissionServerPeerPipelined (TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
-> PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx])
-> TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
-> PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
forall a b. (a -> b) -> a -> b
$
Tracer (IOSim s) (TraceEventServer TxId Tx)
-> TxSubmissionTestParams
-> TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventServer TxId Tx)
-> TxSubmissionTestParams -> TestServer m
testServer Tracer (IOSim s) (TraceEventServer TxId Tx)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer TxSubmissionTestParams
params)
(TxSubmissionClient TxId Tx (IOSim s) ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit (IOSim s) ()
forall txid tx (m :: * -> *) a.
Monad m =>
TxSubmissionClient txid tx m a
-> Peer (TxSubmission2 txid tx) 'AsClient 'StInit m a
txSubmissionClientPeer (TxSubmissionClient TxId Tx (IOSim s) ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit (IOSim s) ())
-> TxSubmissionClient TxId Tx (IOSim s) ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit (IOSim s) ()
forall a b. (a -> b) -> a -> b
$
Tracer (IOSim s) (TraceEventClient TxId Tx)
-> TxSubmissionTestParams
-> TxSubmissionClient TxId Tx (IOSim s) ()
forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventClient TxId Tx)
-> TxSubmissionTestParams -> TestClient m
testClient Tracer (IOSim s) (TraceEventClient TxId Tx)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer TxSubmissionTestParams
params)) of
([Tx]
txs', (), TerminalStates NobodyHasAgency st
R:NobodyHasAgencyTxSubmission2st (*) (*) TxId Tx st
TokDone NobodyHasAgency st
R:NobodyHasAgencyTxSubmission2st (*) (*) TxId Tx 'StDone
TokDone) ->
[Tx]
txs' [Tx] -> [Tx] -> Bool
forall a. Eq a => a -> a -> Bool
== DistinctList Tx -> [Tx]
forall a. DistinctList a -> [a]
fromDistinctList DistinctList Tx
testTransactions
prop_connect2 :: TxSubmissionTestParams -> [Bool] -> Bool
prop_connect2 :: TxSubmissionTestParams -> [Bool] -> Bool
prop_connect2 params :: TxSubmissionTestParams
params@TxSubmissionTestParams{DistinctList Tx
testTransactions :: TxSubmissionTestParams -> DistinctList Tx
testTransactions :: DistinctList Tx
testTransactions}
[Bool]
choices =
case (forall s.
IOSim s ([Tx], (), TerminalStates (TxSubmission2 TxId Tx)))
-> ([Tx], (), TerminalStates (TxSubmission2 TxId Tx))
forall a. (forall s. IOSim s a) -> a
runSimOrThrow
([Bool]
-> PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
-> Peer
(TxSubmission2 TxId Tx) (FlipAgency 'AsServer) 'StInit (IOSim s) ()
-> IOSim s ([Tx], (), TerminalStates (TxSubmission2 TxId Tx))
forall ps (pr :: PeerRole) (st :: ps) (m :: * -> *) a b.
(Monad m, Protocol ps) =>
[Bool]
-> PeerPipelined ps pr st m a
-> Peer ps (FlipAgency pr) st m b
-> m (a, b, TerminalStates ps)
connectPipelined [Bool]
choices
(TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
-> PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
forall txid tx (m :: * -> *) a.
Functor m =>
TxSubmissionServerPipelined txid tx m a
-> PeerPipelined (TxSubmission2 txid tx) 'AsServer 'StInit m a
txSubmissionServerPeerPipelined (TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
-> PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx])
-> TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
-> PeerPipelined
(TxSubmission2 TxId Tx) 'AsServer 'StInit (IOSim s) [Tx]
forall a b. (a -> b) -> a -> b
$
Tracer (IOSim s) (TraceEventServer TxId Tx)
-> TxSubmissionTestParams
-> TxSubmissionServerPipelined TxId Tx (IOSim s) [Tx]
forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventServer TxId Tx)
-> TxSubmissionTestParams -> TestServer m
testServer Tracer (IOSim s) (TraceEventServer TxId Tx)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer TxSubmissionTestParams
params)
(TxSubmissionClient TxId Tx (IOSim s) ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit (IOSim s) ()
forall txid tx (m :: * -> *) a.
Monad m =>
TxSubmissionClient txid tx m a
-> Peer (TxSubmission2 txid tx) 'AsClient 'StInit m a
txSubmissionClientPeer (TxSubmissionClient TxId Tx (IOSim s) ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit (IOSim s) ())
-> TxSubmissionClient TxId Tx (IOSim s) ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit (IOSim s) ()
forall a b. (a -> b) -> a -> b
$
Tracer (IOSim s) (TraceEventClient TxId Tx)
-> TxSubmissionTestParams
-> TxSubmissionClient TxId Tx (IOSim s) ()
forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventClient TxId Tx)
-> TxSubmissionTestParams -> TestClient m
testClient Tracer (IOSim s) (TraceEventClient TxId Tx)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer TxSubmissionTestParams
params)) of
([Tx]
txs', (), TerminalStates NobodyHasAgency st
R:NobodyHasAgencyTxSubmission2st (*) (*) TxId Tx st
TokDone NobodyHasAgency st
R:NobodyHasAgencyTxSubmission2st (*) (*) TxId Tx 'StDone
TokDone) ->
[Tx]
txs' [Tx] -> [Tx] -> Bool
forall a. Eq a => a -> a -> Bool
== DistinctList Tx -> [Tx]
forall a. DistinctList a -> [a]
fromDistinctList DistinctList Tx
testTransactions
prop_channel :: (MonadAsync m, MonadCatch m, MonadST m)
=> m (Channel m ByteString, Channel m ByteString)
-> TxSubmissionTestParams
-> m Bool
prop_channel :: forall (m :: * -> *).
(MonadAsync m, MonadCatch m, MonadST m) =>
m (Channel m ByteString, Channel m ByteString)
-> TxSubmissionTestParams -> m Bool
prop_channel m (Channel m ByteString, Channel m ByteString)
createChannels params :: TxSubmissionTestParams
params@TxSubmissionTestParams{DistinctList Tx
testTransactions :: TxSubmissionTestParams -> DistinctList Tx
testTransactions :: DistinctList Tx
testTransactions} =
(\([Tx]
txs', ()) -> [Tx]
txs' [Tx] -> [Tx] -> Bool
forall a. Eq a => a -> a -> Bool
== DistinctList Tx -> [Tx]
forall a. DistinctList a -> [a]
fromDistinctList DistinctList Tx
testTransactions) (([Tx], ()) -> Bool) -> m ([Tx], ()) -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
m (Channel m ByteString, Channel m ByteString)
-> Tracer m (Role, TraceSendRecv (TxSubmission2 TxId Tx))
-> Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
-> PeerPipelined (TxSubmission2 TxId Tx) 'AsServer 'StInit m [Tx]
-> Peer (TxSubmission2 TxId Tx) (FlipAgency 'AsServer) 'StInit m ()
-> m ([Tx], ())
forall (m :: * -> *) failure ps bytes (pr :: PeerRole) (st :: ps) a
b.
(MonadAsync m, MonadCatch m, Show failure,
forall (st' :: ps). Show (ClientHasAgency st'),
forall (st' :: ps). Show (ServerHasAgency st'), ShowProxy ps) =>
m (Channel m bytes, Channel m bytes)
-> Tracer m (Role, TraceSendRecv ps)
-> Codec ps failure m bytes
-> PeerPipelined ps pr st m a
-> Peer ps (FlipAgency pr) st m b
-> m (a, b)
runConnectedPeersPipelined
m (Channel m ByteString, Channel m ByteString)
createChannels
Tracer m (Role, TraceSendRecv (TxSubmission2 TxId Tx))
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer
Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
forall (m :: * -> *).
MonadST m =>
Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
codec_v2
(TxSubmissionServerPipelined TxId Tx m [Tx]
-> PeerPipelined (TxSubmission2 TxId Tx) 'AsServer 'StInit m [Tx]
forall txid tx (m :: * -> *) a.
Functor m =>
TxSubmissionServerPipelined txid tx m a
-> PeerPipelined (TxSubmission2 txid tx) 'AsServer 'StInit m a
txSubmissionServerPeerPipelined (TxSubmissionServerPipelined TxId Tx m [Tx]
-> PeerPipelined (TxSubmission2 TxId Tx) 'AsServer 'StInit m [Tx])
-> TxSubmissionServerPipelined TxId Tx m [Tx]
-> PeerPipelined (TxSubmission2 TxId Tx) 'AsServer 'StInit m [Tx]
forall a b. (a -> b) -> a -> b
$
Tracer m (TraceEventServer TxId Tx)
-> TxSubmissionTestParams
-> TxSubmissionServerPipelined TxId Tx m [Tx]
forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventServer TxId Tx)
-> TxSubmissionTestParams -> TestServer m
testServer Tracer m (TraceEventServer TxId Tx)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer TxSubmissionTestParams
params)
(TxSubmissionClient TxId Tx m ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit m ()
forall txid tx (m :: * -> *) a.
Monad m =>
TxSubmissionClient txid tx m a
-> Peer (TxSubmission2 txid tx) 'AsClient 'StInit m a
txSubmissionClientPeer (TxSubmissionClient TxId Tx m ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit m ())
-> TxSubmissionClient TxId Tx m ()
-> Peer (TxSubmission2 TxId Tx) 'AsClient 'StInit m ()
forall a b. (a -> b) -> a -> b
$
Tracer m (TraceEventClient TxId Tx)
-> TxSubmissionTestParams -> TxSubmissionClient TxId Tx m ()
forall (m :: * -> *).
Monad m =>
Tracer m (TraceEventClient TxId Tx)
-> TxSubmissionTestParams -> TestClient m
testClient Tracer m (TraceEventClient TxId Tx)
forall (m :: * -> *) a. Applicative m => Tracer m a
nullTracer TxSubmissionTestParams
params)
prop_channel_ST :: TxSubmissionTestParams
-> Bool
prop_channel_ST :: TxSubmissionTestParams -> Bool
prop_channel_ST TxSubmissionTestParams
params =
(forall s. IOSim s Bool) -> Bool
forall a. (forall s. IOSim s a) -> a
runSimOrThrow
(IOSim
s (Channel (IOSim s) ByteString, Channel (IOSim s) ByteString)
-> TxSubmissionTestParams -> IOSim s Bool
forall (m :: * -> *).
(MonadAsync m, MonadCatch m, MonadST m) =>
m (Channel m ByteString, Channel m ByteString)
-> TxSubmissionTestParams -> m Bool
prop_channel IOSim
s (Channel (IOSim s) ByteString, Channel (IOSim s) ByteString)
forall (m :: * -> *) a. MonadSTM m => m (Channel m a, Channel m a)
createConnectedChannels TxSubmissionTestParams
params)
prop_channel_IO :: TxSubmissionTestParams -> Property
prop_channel_IO :: TxSubmissionTestParams -> Property
prop_channel_IO TxSubmissionTestParams
params =
IO Bool -> Property
forall prop. Testable prop => IO prop -> Property
ioProperty (IO (Channel IO ByteString, Channel IO ByteString)
-> TxSubmissionTestParams -> IO Bool
forall (m :: * -> *).
(MonadAsync m, MonadCatch m, MonadST m) =>
m (Channel m ByteString, Channel m ByteString)
-> TxSubmissionTestParams -> m Bool
prop_channel IO (Channel IO ByteString, Channel IO ByteString)
forall (m :: * -> *) a. MonadSTM m => m (Channel m a, Channel m a)
createConnectedChannels TxSubmissionTestParams
params)
prop_pipe_IO :: TxSubmissionTestParams -> Property
prop_pipe_IO :: TxSubmissionTestParams -> Property
prop_pipe_IO TxSubmissionTestParams
params =
IO Bool -> Property
forall prop. Testable prop => IO prop -> Property
ioProperty (IO (Channel IO ByteString, Channel IO ByteString)
-> TxSubmissionTestParams -> IO Bool
forall (m :: * -> *).
(MonadAsync m, MonadCatch m, MonadST m) =>
m (Channel m ByteString, Channel m ByteString)
-> TxSubmissionTestParams -> m Bool
prop_channel IO (Channel IO ByteString, Channel IO ByteString)
createPipeConnectedChannels TxSubmissionTestParams
params)
deriving newtype instance Arbitrary NumTxIdsToAck
deriving newtype instance Arbitrary NumTxIdsToReq
instance Arbitrary (AnyMessageAndAgency (TxSubmission2 TxId Tx)) where
arbitrary :: Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
arbitrary = [Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))]
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall a. [Gen a] -> Gen a
oneof
[ AnyMessageAndAgency (TxSubmission2 TxId Tx)
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AnyMessageAndAgency (TxSubmission2 TxId Tx)
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx)))
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall a b. (a -> b) -> a -> b
$ PeerHasAgency 'AsClient 'StInit
-> Message (TxSubmission2 TxId Tx) 'StInit 'StIdle
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (pr :: PeerRole) ps (st :: ps) (st' :: ps).
PeerHasAgency pr st -> Message ps st st' -> AnyMessageAndAgency ps
AnyMessageAndAgency (ClientHasAgency 'StInit -> PeerHasAgency 'AsClient 'StInit
forall {ps} (st :: ps).
ClientHasAgency st -> PeerHasAgency 'AsClient st
ClientAgency ClientHasAgency 'StInit
forall {k} {k1} {txid :: k} {tx :: k1}. ClientHasAgency 'StInit
TokInit) Message (TxSubmission2 TxId Tx) 'StInit 'StIdle
forall {k} {k1} (txid :: k) (tx :: k1).
Message (TxSubmission2 txid tx) 'StInit 'StIdle
MsgInit
, PeerHasAgency 'AsServer 'StIdle
-> Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StBlocking)
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (pr :: PeerRole) ps (st :: ps) (st' :: ps).
PeerHasAgency pr st -> Message ps st st' -> AnyMessageAndAgency ps
AnyMessageAndAgency (ServerHasAgency 'StIdle -> PeerHasAgency 'AsServer 'StIdle
forall {ps} (st :: ps).
ServerHasAgency st -> PeerHasAgency 'AsServer st
ServerAgency ServerHasAgency 'StIdle
forall {k} {k1} {txid :: k} {tx :: k1}. ServerHasAgency 'StIdle
TokIdle) (Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StBlocking)
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> Gen
(Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StBlocking))
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
(TokBlockingStyle 'StBlocking
-> NumTxIdsToAck
-> NumTxIdsToReq
-> Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StBlocking)
forall {k} {k1} (blocking :: StBlockingStyle) (txid :: k)
(tx :: k1).
TokBlockingStyle blocking
-> NumTxIdsToAck
-> NumTxIdsToReq
-> Message (TxSubmission2 txid tx) 'StIdle ('StTxIds blocking)
MsgRequestTxIds TokBlockingStyle 'StBlocking
TokBlocking
(NumTxIdsToAck
-> NumTxIdsToReq
-> Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StBlocking))
-> Gen NumTxIdsToAck
-> Gen
(NumTxIdsToReq
-> Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StBlocking))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen NumTxIdsToAck
forall a. Arbitrary a => Gen a
arbitrary
Gen
(NumTxIdsToReq
-> Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StBlocking))
-> Gen NumTxIdsToReq
-> Gen
(Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StBlocking))
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen NumTxIdsToReq
forall a. Arbitrary a => Gen a
arbitrary)
, PeerHasAgency 'AsServer 'StIdle
-> Message
(TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StNonBlocking)
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (pr :: PeerRole) ps (st :: ps) (st' :: ps).
PeerHasAgency pr st -> Message ps st st' -> AnyMessageAndAgency ps
AnyMessageAndAgency (ServerHasAgency 'StIdle -> PeerHasAgency 'AsServer 'StIdle
forall {ps} (st :: ps).
ServerHasAgency st -> PeerHasAgency 'AsServer st
ServerAgency ServerHasAgency 'StIdle
forall {k} {k1} {txid :: k} {tx :: k1}. ServerHasAgency 'StIdle
TokIdle) (Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StNonBlocking)
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> Gen
(Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StNonBlocking))
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
(TokBlockingStyle 'StNonBlocking
-> NumTxIdsToAck
-> NumTxIdsToReq
-> Message
(TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StNonBlocking)
forall {k} {k1} (blocking :: StBlockingStyle) (txid :: k)
(tx :: k1).
TokBlockingStyle blocking
-> NumTxIdsToAck
-> NumTxIdsToReq
-> Message (TxSubmission2 txid tx) 'StIdle ('StTxIds blocking)
MsgRequestTxIds TokBlockingStyle 'StNonBlocking
TokNonBlocking
(NumTxIdsToAck
-> NumTxIdsToReq
-> Message
(TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StNonBlocking))
-> Gen NumTxIdsToAck
-> Gen
(NumTxIdsToReq
-> Message
(TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StNonBlocking))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen NumTxIdsToAck
forall a. Arbitrary a => Gen a
arbitrary
Gen
(NumTxIdsToReq
-> Message
(TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StNonBlocking))
-> Gen NumTxIdsToReq
-> Gen
(Message (TxSubmission2 TxId Tx) 'StIdle ('StTxIds 'StNonBlocking))
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen NumTxIdsToReq
forall a. Arbitrary a => Gen a
arbitrary)
, PeerHasAgency 'AsClient ('StTxIds 'StBlocking)
-> Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StIdle
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (pr :: PeerRole) ps (st :: ps) (st' :: ps).
PeerHasAgency pr st -> Message ps st st' -> AnyMessageAndAgency ps
AnyMessageAndAgency (ClientHasAgency ('StTxIds 'StBlocking)
-> PeerHasAgency 'AsClient ('StTxIds 'StBlocking)
forall {ps} (st :: ps).
ClientHasAgency st -> PeerHasAgency 'AsClient st
ClientAgency (TokBlockingStyle 'StBlocking
-> ClientHasAgency ('StTxIds 'StBlocking)
forall {k} {k1} {txid :: k} {tx :: k1} (b :: StBlockingStyle).
TokBlockingStyle b -> ClientHasAgency ('StTxIds b)
TokTxIds TokBlockingStyle 'StBlocking
TokBlocking)) (Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StIdle
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> (BlockingReplyList 'StBlocking (TxId, SizeInBytes)
-> Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StIdle)
-> BlockingReplyList 'StBlocking (TxId, SizeInBytes)
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
BlockingReplyList 'StBlocking (TxId, SizeInBytes)
-> Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StIdle
forall {k1} (blocking :: StBlockingStyle) txid1 (tx :: k1).
BlockingReplyList blocking (txid1, SizeInBytes)
-> Message (TxSubmission2 txid1 tx) ('StTxIds blocking) 'StIdle
MsgReplyTxIds (BlockingReplyList 'StBlocking (TxId, SizeInBytes)
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> Gen (BlockingReplyList 'StBlocking (TxId, SizeInBytes))
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NonEmpty (TxId, SizeInBytes)
-> BlockingReplyList 'StBlocking (TxId, SizeInBytes)
forall a. NonEmpty a -> BlockingReplyList 'StBlocking a
BlockingReply (NonEmpty (TxId, SizeInBytes)
-> BlockingReplyList 'StBlocking (TxId, SizeInBytes))
-> (NonEmptyList (TxId, Word32) -> NonEmpty (TxId, SizeInBytes))
-> NonEmptyList (TxId, Word32)
-> BlockingReplyList 'StBlocking (TxId, SizeInBytes)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(TxId, SizeInBytes)] -> NonEmpty (TxId, SizeInBytes)
forall a. HasCallStack => [a] -> NonEmpty a
NonEmpty.fromList
([(TxId, SizeInBytes)] -> NonEmpty (TxId, SizeInBytes))
-> (NonEmptyList (TxId, Word32) -> [(TxId, SizeInBytes)])
-> NonEmptyList (TxId, Word32)
-> NonEmpty (TxId, SizeInBytes)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((TxId, Word32) -> (TxId, SizeInBytes))
-> [(TxId, Word32)] -> [(TxId, SizeInBytes)]
forall a b. (a -> b) -> [a] -> [b]
map ((Word32 -> SizeInBytes) -> (TxId, Word32) -> (TxId, SizeInBytes)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second Word32 -> SizeInBytes
SizeInBytes)
([(TxId, Word32)] -> [(TxId, SizeInBytes)])
-> (NonEmptyList (TxId, Word32) -> [(TxId, Word32)])
-> NonEmptyList (TxId, Word32)
-> [(TxId, SizeInBytes)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmptyList (TxId, Word32) -> [(TxId, Word32)]
forall a. NonEmptyList a -> [a]
QC.getNonEmpty
(NonEmptyList (TxId, Word32)
-> BlockingReplyList 'StBlocking (TxId, SizeInBytes))
-> Gen (NonEmptyList (TxId, Word32))
-> Gen (BlockingReplyList 'StBlocking (TxId, SizeInBytes))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (NonEmptyList (TxId, Word32))
forall a. Arbitrary a => Gen a
arbitrary)
, PeerHasAgency 'AsClient ('StTxIds 'StNonBlocking)
-> Message
(TxSubmission2 TxId Tx) ('StTxIds 'StNonBlocking) 'StIdle
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (pr :: PeerRole) ps (st :: ps) (st' :: ps).
PeerHasAgency pr st -> Message ps st st' -> AnyMessageAndAgency ps
AnyMessageAndAgency (ClientHasAgency ('StTxIds 'StNonBlocking)
-> PeerHasAgency 'AsClient ('StTxIds 'StNonBlocking)
forall {ps} (st :: ps).
ClientHasAgency st -> PeerHasAgency 'AsClient st
ClientAgency (TokBlockingStyle 'StNonBlocking
-> ClientHasAgency ('StTxIds 'StNonBlocking)
forall {k} {k1} {txid :: k} {tx :: k1} (b :: StBlockingStyle).
TokBlockingStyle b -> ClientHasAgency ('StTxIds b)
TokTxIds TokBlockingStyle 'StNonBlocking
TokNonBlocking)) (Message (TxSubmission2 TxId Tx) ('StTxIds 'StNonBlocking) 'StIdle
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> (BlockingReplyList 'StNonBlocking (TxId, SizeInBytes)
-> Message
(TxSubmission2 TxId Tx) ('StTxIds 'StNonBlocking) 'StIdle)
-> BlockingReplyList 'StNonBlocking (TxId, SizeInBytes)
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
BlockingReplyList 'StNonBlocking (TxId, SizeInBytes)
-> Message
(TxSubmission2 TxId Tx) ('StTxIds 'StNonBlocking) 'StIdle
forall {k1} (blocking :: StBlockingStyle) txid1 (tx :: k1).
BlockingReplyList blocking (txid1, SizeInBytes)
-> Message (TxSubmission2 txid1 tx) ('StTxIds blocking) 'StIdle
MsgReplyTxIds (BlockingReplyList 'StNonBlocking (TxId, SizeInBytes)
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> Gen (BlockingReplyList 'StNonBlocking (TxId, SizeInBytes))
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ([(TxId, SizeInBytes)]
-> BlockingReplyList 'StNonBlocking (TxId, SizeInBytes)
forall a. [a] -> BlockingReplyList 'StNonBlocking a
NonBlockingReply ([(TxId, SizeInBytes)]
-> BlockingReplyList 'StNonBlocking (TxId, SizeInBytes))
-> ([(TxId, Word32)] -> [(TxId, SizeInBytes)])
-> [(TxId, Word32)]
-> BlockingReplyList 'StNonBlocking (TxId, SizeInBytes)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((TxId, Word32) -> (TxId, SizeInBytes))
-> [(TxId, Word32)] -> [(TxId, SizeInBytes)]
forall a b. (a -> b) -> [a] -> [b]
map ((Word32 -> SizeInBytes) -> (TxId, Word32) -> (TxId, SizeInBytes)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second Word32 -> SizeInBytes
SizeInBytes) ([(TxId, Word32)]
-> BlockingReplyList 'StNonBlocking (TxId, SizeInBytes))
-> Gen [(TxId, Word32)]
-> Gen (BlockingReplyList 'StNonBlocking (TxId, SizeInBytes))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [(TxId, Word32)]
forall a. Arbitrary a => Gen a
arbitrary)
, PeerHasAgency 'AsServer 'StIdle
-> Message (TxSubmission2 TxId Tx) 'StIdle 'StTxs
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (pr :: PeerRole) ps (st :: ps) (st' :: ps).
PeerHasAgency pr st -> Message ps st st' -> AnyMessageAndAgency ps
AnyMessageAndAgency (ServerHasAgency 'StIdle -> PeerHasAgency 'AsServer 'StIdle
forall {ps} (st :: ps).
ServerHasAgency st -> PeerHasAgency 'AsServer st
ServerAgency ServerHasAgency 'StIdle
forall {k} {k1} {txid :: k} {tx :: k1}. ServerHasAgency 'StIdle
TokIdle) (Message (TxSubmission2 TxId Tx) 'StIdle 'StTxs
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> ([TxId] -> Message (TxSubmission2 TxId Tx) 'StIdle 'StTxs)
-> [TxId]
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
[TxId] -> Message (TxSubmission2 TxId Tx) 'StIdle 'StTxs
forall {k1} txid1 (tx :: k1).
[txid1] -> Message (TxSubmission2 txid1 tx) 'StIdle 'StTxs
MsgRequestTxs ([TxId] -> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> Gen [TxId] -> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [TxId]
forall a. Arbitrary a => Gen a
arbitrary
, PeerHasAgency 'AsClient 'StTxs
-> Message (TxSubmission2 TxId Tx) 'StTxs 'StIdle
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (pr :: PeerRole) ps (st :: ps) (st' :: ps).
PeerHasAgency pr st -> Message ps st st' -> AnyMessageAndAgency ps
AnyMessageAndAgency (ClientHasAgency 'StTxs -> PeerHasAgency 'AsClient 'StTxs
forall {ps} (st :: ps).
ClientHasAgency st -> PeerHasAgency 'AsClient st
ClientAgency ClientHasAgency 'StTxs
forall {k} {k1} {txid :: k} {tx :: k1}. ClientHasAgency 'StTxs
TokTxs) (Message (TxSubmission2 TxId Tx) 'StTxs 'StIdle
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> ([Tx] -> Message (TxSubmission2 TxId Tx) 'StTxs 'StIdle)
-> [Tx]
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
[Tx] -> Message (TxSubmission2 TxId Tx) 'StTxs 'StIdle
forall {k} tx1 (txid :: k).
[tx1] -> Message (TxSubmission2 txid tx1) 'StTxs 'StIdle
MsgReplyTxs ([Tx] -> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> Gen [Tx] -> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [Tx]
forall a. Arbitrary a => Gen a
arbitrary
, PeerHasAgency 'AsClient ('StTxIds 'StBlocking)
-> Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StDone
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
forall (pr :: PeerRole) ps (st :: ps) (st' :: ps).
PeerHasAgency pr st -> Message ps st st' -> AnyMessageAndAgency ps
AnyMessageAndAgency (ClientHasAgency ('StTxIds 'StBlocking)
-> PeerHasAgency 'AsClient ('StTxIds 'StBlocking)
forall {ps} (st :: ps).
ClientHasAgency st -> PeerHasAgency 'AsClient st
ClientAgency (TokBlockingStyle 'StBlocking
-> ClientHasAgency ('StTxIds 'StBlocking)
forall {k} {k1} {txid :: k} {tx :: k1} (b :: StBlockingStyle).
TokBlockingStyle b -> ClientHasAgency ('StTxIds b)
TokTxIds TokBlockingStyle 'StBlocking
TokBlocking)) (Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StDone
-> AnyMessageAndAgency (TxSubmission2 TxId Tx))
-> Gen
(Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StDone)
-> Gen (AnyMessageAndAgency (TxSubmission2 TxId Tx))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StDone
-> Gen
(Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StDone)
forall a. a -> Gen a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Message (TxSubmission2 TxId Tx) ('StTxIds 'StBlocking) 'StDone
forall {k} {k1} (txid :: k) (tx :: k1).
Message (TxSubmission2 txid tx) ('StTxIds 'StBlocking) 'StDone
MsgDone
]
instance (Eq txid, Eq tx) => Eq (AnyMessage (TxSubmission2 txid tx)) where
== :: AnyMessage (TxSubmission2 txid tx)
-> AnyMessage (TxSubmission2 txid tx) -> Bool
(==) (AnyMessage Message (TxSubmission2 txid tx) st st'
R:MessageTxSubmission2fromto (*) (*) txid tx st st'
MsgInit)
(AnyMessage Message (TxSubmission2 txid tx) st st'
R:MessageTxSubmission2fromto (*) (*) txid tx st st'
MsgInit) = Bool
True
(==) (AnyMessage (MsgRequestTxIds TokBlockingStyle blocking
TokBlocking NumTxIdsToAck
ackNo NumTxIdsToReq
reqNo))
(AnyMessage (MsgRequestTxIds TokBlockingStyle blocking
TokBlocking NumTxIdsToAck
ackNo' NumTxIdsToReq
reqNo')) =
(NumTxIdsToAck
ackNo, NumTxIdsToReq
reqNo) (NumTxIdsToAck, NumTxIdsToReq)
-> (NumTxIdsToAck, NumTxIdsToReq) -> Bool
forall a. Eq a => a -> a -> Bool
== (NumTxIdsToAck
ackNo', NumTxIdsToReq
reqNo')
(==) (AnyMessage (MsgRequestTxIds TokBlockingStyle blocking
TokNonBlocking NumTxIdsToAck
ackNo NumTxIdsToReq
reqNo))
(AnyMessage (MsgRequestTxIds TokBlockingStyle blocking
TokNonBlocking NumTxIdsToAck
ackNo' NumTxIdsToReq
reqNo')) =
(NumTxIdsToAck
ackNo, NumTxIdsToReq
reqNo) (NumTxIdsToAck, NumTxIdsToReq)
-> (NumTxIdsToAck, NumTxIdsToReq) -> Bool
forall a. Eq a => a -> a -> Bool
== (NumTxIdsToAck
ackNo', NumTxIdsToReq
reqNo')
(==) (AnyMessage (MsgReplyTxIds (BlockingReply NonEmpty (txid1, SizeInBytes)
txids)))
(AnyMessage (MsgReplyTxIds (BlockingReply NonEmpty (txid1, SizeInBytes)
txids'))) =
NonEmpty (txid1, SizeInBytes)
txids NonEmpty (txid1, SizeInBytes)
-> NonEmpty (txid1, SizeInBytes) -> Bool
forall a. Eq a => a -> a -> Bool
== NonEmpty (txid1, SizeInBytes)
NonEmpty (txid1, SizeInBytes)
txids'
(==) (AnyMessage (MsgReplyTxIds (NonBlockingReply [(txid1, SizeInBytes)]
txids)))
(AnyMessage (MsgReplyTxIds (NonBlockingReply [(txid1, SizeInBytes)]
txids'))) =
[(txid1, SizeInBytes)]
txids [(txid1, SizeInBytes)] -> [(txid1, SizeInBytes)] -> Bool
forall a. Eq a => a -> a -> Bool
== [(txid1, SizeInBytes)]
[(txid1, SizeInBytes)]
txids'
(==) (AnyMessage (MsgRequestTxs [txid1]
txids))
(AnyMessage (MsgRequestTxs [txid1]
txids')) = [txid1]
txids [txid1] -> [txid1] -> Bool
forall a. Eq a => a -> a -> Bool
== [txid1]
[txid1]
txids'
(==) (AnyMessage (MsgReplyTxs [tx1]
txs))
(AnyMessage (MsgReplyTxs [tx1]
txs')) = [tx1]
txs [tx1] -> [tx1] -> Bool
forall a. Eq a => a -> a -> Bool
== [tx1]
[tx1]
txs'
(==) (AnyMessage Message (TxSubmission2 txid tx) st st'
R:MessageTxSubmission2fromto (*) (*) txid tx st st'
MsgDone)
(AnyMessage Message (TxSubmission2 txid tx) st st'
R:MessageTxSubmission2fromto (*) (*) txid tx st st'
MsgDone) = Bool
True
AnyMessage (TxSubmission2 txid tx)
_ == AnyMessage (TxSubmission2 txid tx)
_ = Bool
False
codec_v2 :: MonadST m
=> Codec (TxSubmission2 TxId Tx)
DeserialiseFailure
m ByteString
codec_v2 :: forall (m :: * -> *).
MonadST m =>
Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
codec_v2 = (TxId -> Encoding)
-> (forall s. Decoder s TxId)
-> (Tx -> Encoding)
-> (forall s. Decoder s Tx)
-> Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
forall txid tx (m :: * -> *).
MonadST m =>
(txid -> Encoding)
-> (forall s. Decoder s txid)
-> (tx -> Encoding)
-> (forall s. Decoder s tx)
-> Codec (TxSubmission2 txid tx) DeserialiseFailure m ByteString
codecTxSubmission2
TxId -> Encoding
forall a. Serialise a => a -> Encoding
Serialise.encode Decoder s TxId
forall s. Decoder s TxId
forall a s. Serialise a => Decoder s a
Serialise.decode
Tx -> Encoding
forall a. Serialise a => a -> Encoding
Serialise.encode Decoder s Tx
forall s. Decoder s Tx
forall a s. Serialise a => Decoder s a
Serialise.decode
prop_codec :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg =
(forall s. ST s Bool) -> Bool
forall a. (forall s. ST s a) -> a
runST (Codec (TxSubmission2 TxId Tx) DeserialiseFailure (ST s) ByteString
-> AnyMessageAndAgency (TxSubmission2 TxId Tx) -> ST s Bool
forall ps failure (m :: * -> *) bytes.
(Monad m, Eq (AnyMessage ps)) =>
Codec ps failure m bytes -> AnyMessageAndAgency ps -> m Bool
prop_codecM Codec (TxSubmission2 TxId Tx) DeserialiseFailure (ST s) ByteString
forall (m :: * -> *).
MonadST m =>
Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
codec_v2 AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg)
prop_codec_id :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_id :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_id AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg =
(forall s. ST s Bool) -> Bool
forall a. (forall s. ST s a) -> a
runST (Codec
(TxSubmission2 TxId Tx)
CodecFailure
(ST s)
(AnyMessage (TxSubmission2 TxId Tx))
-> AnyMessageAndAgency (TxSubmission2 TxId Tx) -> ST s Bool
forall ps failure (m :: * -> *) bytes.
(Monad m, Eq (AnyMessage ps)) =>
Codec ps failure m bytes -> AnyMessageAndAgency ps -> m Bool
prop_codecM Codec
(TxSubmission2 TxId Tx)
CodecFailure
(ST s)
(AnyMessage (TxSubmission2 TxId Tx))
forall {k} {k1} (txid :: k) (tx :: k1) (m :: * -> *).
Monad m =>
Codec
(TxSubmission2 txid tx)
CodecFailure
m
(AnyMessage (TxSubmission2 txid tx))
codecTxSubmission2Id AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg)
prop_codec_splits2 :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_splits2 :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_splits2 AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg =
(forall s. ST s Bool) -> Bool
forall a. (forall s. ST s a) -> a
runST ((ByteString -> [[ByteString]])
-> Codec
(TxSubmission2 TxId Tx) DeserialiseFailure (ST s) ByteString
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
-> ST s Bool
forall ps failure (m :: * -> *) bytes.
(Monad m, Eq (AnyMessage ps)) =>
(bytes -> [[bytes]])
-> Codec ps failure m bytes -> AnyMessageAndAgency ps -> m Bool
prop_codec_splitsM ByteString -> [[ByteString]]
splits2 Codec (TxSubmission2 TxId Tx) DeserialiseFailure (ST s) ByteString
forall (m :: * -> *).
MonadST m =>
Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
codec_v2 AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg)
prop_codec_splits3 :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_splits3 :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_splits3 AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg =
(forall s. ST s Bool) -> Bool
forall a. (forall s. ST s a) -> a
runST ((ByteString -> [[ByteString]])
-> Codec
(TxSubmission2 TxId Tx) DeserialiseFailure (ST s) ByteString
-> AnyMessageAndAgency (TxSubmission2 TxId Tx)
-> ST s Bool
forall ps failure (m :: * -> *) bytes.
(Monad m, Eq (AnyMessage ps)) =>
(bytes -> [[bytes]])
-> Codec ps failure m bytes -> AnyMessageAndAgency ps -> m Bool
prop_codec_splitsM ByteString -> [[ByteString]]
splits3 Codec (TxSubmission2 TxId Tx) DeserialiseFailure (ST s) ByteString
forall (m :: * -> *).
MonadST m =>
Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
codec_v2 AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg)
prop_codec_cbor
:: AnyMessageAndAgency (TxSubmission2 TxId Tx)
-> Bool
prop_codec_cbor :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Bool
prop_codec_cbor AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg =
(forall s. ST s Bool) -> Bool
forall a. (forall s. ST s a) -> a
runST (Codec (TxSubmission2 TxId Tx) DeserialiseFailure (ST s) ByteString
-> AnyMessageAndAgency (TxSubmission2 TxId Tx) -> ST s Bool
forall ps (m :: * -> *).
(Monad m, Eq (AnyMessage ps)) =>
Codec ps DeserialiseFailure m ByteString
-> AnyMessageAndAgency ps -> m Bool
prop_codec_cborM Codec (TxSubmission2 TxId Tx) DeserialiseFailure (ST s) ByteString
forall (m :: * -> *).
MonadST m =>
Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
codec_v2 AnyMessageAndAgency (TxSubmission2 TxId Tx)
msg)
prop_codec_valid_cbor
:: AnyMessageAndAgency (TxSubmission2 TxId Tx)
-> Property
prop_codec_valid_cbor :: AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Property
prop_codec_valid_cbor = Codec (TxSubmission2 TxId Tx) DeserialiseFailure IO ByteString
-> AnyMessageAndAgency (TxSubmission2 TxId Tx) -> Property
forall ps.
Codec ps DeserialiseFailure IO ByteString
-> AnyMessageAndAgency ps -> Property
prop_codec_valid_cbor_encoding Codec (TxSubmission2 TxId Tx) DeserialiseFailure IO ByteString
forall (m :: * -> *).
MonadST m =>
Codec (TxSubmission2 TxId Tx) DeserialiseFailure m ByteString
codec_v2
data TxSubmissionTestParams =
TxSubmissionTestParams {
TxSubmissionTestParams -> Positive (Small Word16)
testMaxUnacked :: Positive (Small Word16),
TxSubmissionTestParams -> Positive (Small Word16)
testMaxTxIdsToRequest :: Positive (Small Word16),
TxSubmissionTestParams -> Positive (Small Word16)
testMaxTxToRequest :: Positive (Small Word16),
TxSubmissionTestParams -> DistinctList Tx
testTransactions :: DistinctList Tx
}
deriving Int -> TxSubmissionTestParams -> ShowS
[TxSubmissionTestParams] -> ShowS
TxSubmissionTestParams -> TestName
(Int -> TxSubmissionTestParams -> ShowS)
-> (TxSubmissionTestParams -> TestName)
-> ([TxSubmissionTestParams] -> ShowS)
-> Show TxSubmissionTestParams
forall a.
(Int -> a -> ShowS) -> (a -> TestName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TxSubmissionTestParams -> ShowS
showsPrec :: Int -> TxSubmissionTestParams -> ShowS
$cshow :: TxSubmissionTestParams -> TestName
show :: TxSubmissionTestParams -> TestName
$cshowList :: [TxSubmissionTestParams] -> ShowS
showList :: [TxSubmissionTestParams] -> ShowS
Show
instance Arbitrary TxSubmissionTestParams where
arbitrary :: Gen TxSubmissionTestParams
arbitrary =
Positive (Small Word16)
-> Positive (Small Word16)
-> Positive (Small Word16)
-> DistinctList Tx
-> TxSubmissionTestParams
TxSubmissionTestParams (Positive (Small Word16)
-> Positive (Small Word16)
-> Positive (Small Word16)
-> DistinctList Tx
-> TxSubmissionTestParams)
-> Gen (Positive (Small Word16))
-> Gen
(Positive (Small Word16)
-> Positive (Small Word16)
-> DistinctList Tx
-> TxSubmissionTestParams)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Positive (Small Word16))
forall a. Arbitrary a => Gen a
arbitrary
Gen
(Positive (Small Word16)
-> Positive (Small Word16)
-> DistinctList Tx
-> TxSubmissionTestParams)
-> Gen (Positive (Small Word16))
-> Gen
(Positive (Small Word16)
-> DistinctList Tx -> TxSubmissionTestParams)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Positive (Small Word16))
forall a. Arbitrary a => Gen a
arbitrary
Gen
(Positive (Small Word16)
-> DistinctList Tx -> TxSubmissionTestParams)
-> Gen (Positive (Small Word16))
-> Gen (DistinctList Tx -> TxSubmissionTestParams)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Positive (Small Word16))
forall a. Arbitrary a => Gen a
arbitrary
Gen (DistinctList Tx -> TxSubmissionTestParams)
-> Gen (DistinctList Tx) -> Gen TxSubmissionTestParams
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (DistinctList Tx)
forall a. Arbitrary a => Gen a
arbitrary
shrink :: TxSubmissionTestParams -> [TxSubmissionTestParams]
shrink (TxSubmissionTestParams Positive (Small Word16)
a Positive (Small Word16)
b Positive (Small Word16)
c DistinctList Tx
d) =
[ Positive (Small Word16)
-> Positive (Small Word16)
-> Positive (Small Word16)
-> DistinctList Tx
-> TxSubmissionTestParams
TxSubmissionTestParams Positive (Small Word16)
a' Positive (Small Word16)
b' Positive (Small Word16)
c' DistinctList Tx
d'
| (Positive (Small Word16)
a', Positive (Small Word16)
b', Positive (Small Word16)
c', DistinctList Tx
d') <- (Positive (Small Word16), Positive (Small Word16),
Positive (Small Word16), DistinctList Tx)
-> [(Positive (Small Word16), Positive (Small Word16),
Positive (Small Word16), DistinctList Tx)]
forall a. Arbitrary a => a -> [a]
shrink (Positive (Small Word16)
a, Positive (Small Word16)
b, Positive (Small Word16)
c, DistinctList Tx
d) ]
newtype DistinctList a = DistinctList { forall a. DistinctList a -> [a]
fromDistinctList :: [a] }
deriving Int -> DistinctList a -> ShowS
[DistinctList a] -> ShowS
DistinctList a -> TestName
(Int -> DistinctList a -> ShowS)
-> (DistinctList a -> TestName)
-> ([DistinctList a] -> ShowS)
-> Show (DistinctList a)
forall a. Show a => Int -> DistinctList a -> ShowS
forall a. Show a => [DistinctList a] -> ShowS
forall a. Show a => DistinctList a -> TestName
forall a.
(Int -> a -> ShowS) -> (a -> TestName) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> DistinctList a -> ShowS
showsPrec :: Int -> DistinctList a -> ShowS
$cshow :: forall a. Show a => DistinctList a -> TestName
show :: DistinctList a -> TestName
$cshowList :: forall a. Show a => [DistinctList a] -> ShowS
showList :: [DistinctList a] -> ShowS
Show
instance (Eq a, Arbitrary a) => Arbitrary (DistinctList a) where
arbitrary :: Gen (DistinctList a)
arbitrary = [a] -> DistinctList a
forall a. [a] -> DistinctList a
DistinctList ([a] -> DistinctList a) -> ([a] -> [a]) -> [a] -> DistinctList a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> [a]
forall a. Eq a => [a] -> [a]
nub ([a] -> DistinctList a) -> Gen [a] -> Gen (DistinctList a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [a]
forall a. Arbitrary a => Gen a
arbitrary
shrink :: DistinctList a -> [DistinctList a]
shrink (DistinctList [a]
xs) =
[ [a] -> DistinctList a
forall a. [a] -> DistinctList a
DistinctList ([a] -> [a]
forall a. Eq a => [a] -> [a]
nub [a]
xs') | [a]
xs' <- [a] -> [[a]]
forall a. Arbitrary a => a -> [a]
shrink [a]
xs ]