22
33module Spec.BotPlutusInterface.CoinSelection (tests ) where
44
5- import BotPlutusInterface.CoinSelection (selectTxIns , uniqueAssetClasses )
5+ import BotPlutusInterface.CoinSelection (selectTxIns , uniqueAssetClasses , valuesToVecs )
66import BotPlutusInterface.Effects (PABEffect )
7+ import Control.Lens (folded , to , (^..) )
78import Control.Monad (replicateM )
89import Data.Default (def )
910import Data.Map qualified as Map
11+ import Data.Set (Set )
1012import Data.Set qualified as Set
1113import Data.Text qualified as Text
14+ import Data.Vector (Vector )
15+ import Data.Vector qualified as Vec
1216import Ledger qualified
1317import Ledger.Ada qualified as Ada
1418import Ledger.Address (Address , PaymentPubKeyHash (PaymentPubKeyHash ))
1519import Ledger.Address qualified as Address
1620import Ledger.CardanoWallet qualified as Wallet
1721import Ledger.Crypto (PubKeyHash )
1822import Ledger.Tx (TxIn (.. ), TxInType (.. ), TxOut (.. ), TxOutRef (.. ))
19- import Ledger.Value (Value )
23+ import Ledger.Value (Value , AssetClass )
2024import Ledger.Value qualified as Value
2125import Spec.MockContract (runPABEffectPure )
2226import Spec.RandomLedger
23- import Test.QuickCheck (Gen , Property , forAll )
27+ import Test.QuickCheck (Gen , Property , forAll , withMaxSuccess )
2428import Test.Tasty (TestTree , testGroup )
2529import Test.Tasty.HUnit (Assertion , assertFailure , testCase , (@?=) )
2630import Test.Tasty.QuickCheck (testProperty )
@@ -31,6 +35,7 @@ tests =
3135 testGroup
3236 " BotPlutusInterface.CoinSelection"
3337 [ testProperty " Have All unique assetClasses" assertUniqueAssetClasses
38+ , testProperty " columns of vectors represent same assetClass" validValueVectors
3439 , testCase " Coin selection greedy Approx" greedyApprox
3540 ]
3641
@@ -102,13 +107,36 @@ greedyApprox = do
102107 Right result -> result @?= expectedResults
103108
104109assertUniqueAssetClasses :: Property
105- assertUniqueAssetClasses = forAll isSubsetGen id
110+ assertUniqueAssetClasses = withMaxSuccess 1000 ( forAll isSubsetGen id )
106111 where
107112 isSubsetGen :: Gen Bool
108113 isSubsetGen =
109114 do
110115 allAcs <- randomAssetClasses 30
111116 values <- replicateM 10 (txOutValue <$> randomTxOut 10 allAcs)
112117
113- let uniqueAcs = uniqueAssetClasses values
118+ let uniqueAcs :: Set AssetClass
119+ uniqueAcs = uniqueAssetClasses values
120+
114121 return $ Set. isSubsetOf uniqueAcs allAcs
122+
123+ validValueVectors :: Property
124+ validValueVectors = withMaxSuccess 1000 (forAll valueVectorsGen id )
125+ where
126+ valueVectorsGen :: Gen Bool
127+ valueVectorsGen =
128+ do
129+ allAcs <- randomAssetClasses 30
130+ values <- replicateM 10 (txOutValue <$> randomTxOut 10 allAcs)
131+
132+ let uniqueAcs :: Set AssetClass
133+ uniqueAcs = uniqueAssetClasses values
134+
135+ valueCheck :: Value -> Vector Integer -> Bool
136+ valueCheck value vec =
137+ Vec. fromList (uniqueAcs ^.. folded . to (Value. assetClassValueOf value)) == vec
138+
139+ valuesVec :: [Vector Integer ]
140+ valuesVec = Vec. toList $ valuesToVecs uniqueAcs values
141+
142+ return $ all (uncurry valueCheck) (zip values valuesVec)
0 commit comments