diff --git a/lib/core/cardano-wallet-core.cabal b/lib/core/cardano-wallet-core.cabal index 8b7fa82d08c..55498bfdb3d 100644 --- a/lib/core/cardano-wallet-core.cabal +++ b/lib/core/cardano-wallet-core.cabal @@ -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 diff --git a/lib/core/src/Cardano/Wallet/Primitive/Types/UTxO/Gen.hs b/lib/core/src/Cardano/Wallet/Primitive/Types/UTxO/Gen.hs new file mode 100644 index 00000000000..4213e578d2f --- /dev/null +++ b/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 diff --git a/lib/core/src/Cardano/Wallet/Primitive/Types/UTxOIndex/Gen.hs b/lib/core/src/Cardano/Wallet/Primitive/Types/UTxOIndex/Gen.hs index 57dbbeb1b78..f70aa59a909 100644 --- a/lib/core/src/Cardano/Wallet/Primitive/Types/UTxOIndex/Gen.hs +++ b/lib/core/src/Cardano/Wallet/Primitive/Types/UTxOIndex/Gen.hs @@ -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 ) @@ -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 @@ -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) @@ -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 diff --git a/lib/core/test/unit/Cardano/Wallet/Api/ServerSpec.hs b/lib/core/test/unit/Cardano/Wallet/Api/ServerSpec.hs index 1aebc65222c..d05aa260c37 100644 --- a/lib/core/test/unit/Cardano/Wallet/Api/ServerSpec.hs +++ b/lib/core/test/unit/Cardano/Wallet/Api/ServerSpec.hs @@ -65,10 +65,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 @@ -409,8 +407,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