Skip to content

Commit

Permalink
Add separate UTxO generators
Browse files Browse the repository at this point in the history
Instead of using the UTxOIndex generators, and converting back to UTxOs,
this commits adds generators for UTxO.

1. Mimic the generators in UTxOIndex.Gen
2. Make UTxOIndex.Gen use UTxO.Gen
3. Use UTxO.Gen in ServerSpec

In response to the suggestion #2684 (comment)
  • Loading branch information
Anviking authored and rvl committed Jun 14, 2021
1 parent 6105028 commit 6522381
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 35 deletions.
1 change: 1 addition & 0 deletions lib/core/cardano-wallet-core.cabal
Expand Up @@ -231,6 +231,7 @@ library
Cardano.Wallet.Primitive.Types.TokenQuantity.Gen
Cardano.Wallet.Primitive.Types.Tx.Gen
Cardano.Wallet.Primitive.Types.UTxOIndex.Gen
Cardano.Wallet.Primitive.Types.UTxO.Gen
other-modules:
Paths_cardano_wallet_core

Expand Down
79 changes: 79 additions & 0 deletions lib/core/src/Cardano/Wallet/Primitive/Types/UTxO/Gen.hs
@@ -0,0 +1,79 @@
module Cardano.Wallet.Primitive.Types.UTxO.Gen
( genUTxOSmall
, genUTxOLarge
, genUTxOLargeN
, shrinkUTxOSmall
) where

import Prelude

import Cardano.Wallet.Primitive.Types.Tx
( TxIn, TxOut )
import Cardano.Wallet.Primitive.Types.Tx.Gen
( genTxInLargeRange
, genTxInSmallRange
, genTxOutSmallRange
, shrinkTxInSmallRange
, shrinkTxOutSmallRange
)
import Cardano.Wallet.Primitive.Types.UTxO
( UTxO (..) )
import Control.Monad
( replicateM )
import Test.QuickCheck
( Gen, choose, frequency, shrinkList )
import Test.QuickCheck.Extra
( shrinkInterleaved )

import qualified Data.Map as Map

--------------------------------------------------------------------------------
-- Small indices
--------------------------------------------------------------------------------

genUTxOSmall :: Gen UTxO
genUTxOSmall = do
entryCount <- frequency
[ (1, pure 0)
, (1, pure 1)
, (32, choose (2, 64))
]
UTxO . Map.fromList <$> replicateM entryCount genEntrySmallRange

shrinkUTxOSmall :: UTxO -> [UTxO]
shrinkUTxOSmall
= take 16
. fmap (UTxO . Map.fromList)
. shrinkList shrinkEntrySmallRange
. Map.toList
. getUTxO

genEntrySmallRange :: Gen (TxIn, TxOut)
genEntrySmallRange = (,)
<$> genTxInSmallRange
<*> genTxOutSmallRange

shrinkEntrySmallRange :: (TxIn, TxOut) -> [(TxIn, TxOut)]
shrinkEntrySmallRange (i, o) = uncurry (,) <$> shrinkInterleaved
(i, shrinkTxInSmallRange)
(o, shrinkTxOutSmallRange)

--------------------------------------------------------------------------------
-- Large indices
--------------------------------------------------------------------------------

genUTxOLarge :: Gen UTxO
genUTxOLarge = do
entryCount <- choose (1024, 4096)
genUTxOLargeN entryCount

genUTxOLargeN :: Int -> Gen UTxO
genUTxOLargeN entryCount = do
UTxO . Map.fromList <$> replicateM entryCount genEntryLargeRange

genEntryLargeRange :: Gen (TxIn, TxOut)
genEntryLargeRange = (,)
<$> genTxInLargeRange
-- Note that we don't need to choose outputs from a large range, as inputs
-- are already chosen from a large range:
<*> genTxOutSmallRange
35 changes: 6 additions & 29 deletions lib/core/src/Cardano/Wallet/Primitive/Types/UTxOIndex/Gen.hs
Expand Up @@ -10,18 +10,13 @@ import Prelude
import Cardano.Wallet.Primitive.Types.Tx
( TxIn, TxOut )
import Cardano.Wallet.Primitive.Types.Tx.Gen
( genTxInLargeRange
, genTxInSmallRange
, genTxOutSmallRange
, shrinkTxInSmallRange
, shrinkTxOutSmallRange
)
( shrinkTxInSmallRange, shrinkTxOutSmallRange )
import Cardano.Wallet.Primitive.Types.UTxO.Gen
( genUTxOLargeN, genUTxOSmall )
import Cardano.Wallet.Primitive.Types.UTxOIndex
( UTxOIndex )
import Control.Monad
( replicateM )
import Test.QuickCheck
( Gen, choose, frequency, shrinkList )
( Gen, choose, shrinkList )
import Test.QuickCheck.Extra
( shrinkInterleaved )

Expand All @@ -32,13 +27,7 @@ import qualified Cardano.Wallet.Primitive.Types.UTxOIndex as UTxOIndex
--------------------------------------------------------------------------------

genUTxOIndexSmall :: Gen UTxOIndex
genUTxOIndexSmall = do
entryCount <- frequency
[ (1, pure 0)
, (1, pure 1)
, (32, choose (2, 64))
]
UTxOIndex.fromSequence <$> replicateM entryCount genEntrySmallRange
genUTxOIndexSmall = UTxOIndex.fromUTxO <$> genUTxOSmall

shrinkUTxOIndexSmall :: UTxOIndex -> [UTxOIndex]
shrinkUTxOIndexSmall
Expand All @@ -47,11 +36,6 @@ shrinkUTxOIndexSmall
. shrinkList shrinkEntrySmallRange
. UTxOIndex.toList

genEntrySmallRange :: Gen (TxIn, TxOut)
genEntrySmallRange = (,)
<$> genTxInSmallRange
<*> genTxOutSmallRange

shrinkEntrySmallRange :: (TxIn, TxOut) -> [(TxIn, TxOut)]
shrinkEntrySmallRange (i, o) = uncurry (,) <$> shrinkInterleaved
(i, shrinkTxInSmallRange)
Expand All @@ -68,11 +52,4 @@ genUTxOIndexLarge = do

genUTxOIndexLargeN :: Int -> Gen UTxOIndex
genUTxOIndexLargeN entryCount = do
UTxOIndex.fromSequence <$> replicateM entryCount genEntryLargeRange

genEntryLargeRange :: Gen (TxIn, TxOut)
genEntryLargeRange = (,)
<$> genTxInLargeRange
-- Note that we don't need to choose outputs from a large range, as inputs
-- are already chosen from a large range:
<*> genTxOutSmallRange
UTxOIndex.fromUTxO <$> genUTxOLargeN entryCount
10 changes: 4 additions & 6 deletions lib/core/test/unit/Cardano/Wallet/Api/ServerSpec.hs
Expand Up @@ -66,10 +66,8 @@ import Cardano.Wallet.Primitive.Types.RewardAccount
( RewardAccount (..) )
import Cardano.Wallet.Primitive.Types.UTxO
( UTxO, balance )
import Cardano.Wallet.Primitive.Types.UTxOIndex
( fromUTxO, toUTxO )
import Cardano.Wallet.Primitive.Types.UTxOIndex.Gen
( genUTxOIndexSmall, shrinkUTxOIndexSmall )
import Cardano.Wallet.Primitive.Types.UTxO.Gen
( genUTxOSmall, shrinkUTxOSmall )
import Cardano.Wallet.Unsafe
( unsafeFromText )
import Control.Monad
Expand Down Expand Up @@ -413,8 +411,8 @@ accountOfAddress (Address bytes) =
else Just $ RewardAccount $ B8.pack [char]

instance Arbitrary UTxO where
arbitrary = toUTxO <$> genUTxOIndexSmall
shrink = map toUTxO . shrinkUTxOIndexSmall . fromUTxO
arbitrary = genUTxOSmall
shrink = shrinkUTxOSmall

instance Arbitrary Natural where
arbitrary = fromIntegral . getNonNegative @Int <$> arbitrary
Expand Down

0 comments on commit 6522381

Please sign in to comment.