Skip to content

Commit e1533a6

Browse files
committed
add property test to check for valid columns in vectors
1 parent 74995cf commit e1533a6

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

bot-plutus-interface.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ test-suite bot-plutus-interface-test
239239
, text ^>=1.2.4.0
240240
, utf8-string
241241
, uuid
242+
, vector
242243
, warp
243244

244245
hs-source-dirs: test

cabal.project

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ packages: ./bot-plutus-interface.cabal
77

88
tests: true
99
benchmarks: true
10+
test-show-details: direct

test/Spec/BotPlutusInterface/CoinSelection.hs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,29 @@
22

33
module Spec.BotPlutusInterface.CoinSelection (tests) where
44

5-
import BotPlutusInterface.CoinSelection (selectTxIns, uniqueAssetClasses)
5+
import BotPlutusInterface.CoinSelection (selectTxIns, uniqueAssetClasses, valuesToVecs)
66
import BotPlutusInterface.Effects (PABEffect)
7+
import Control.Lens (folded, to, (^..))
78
import Control.Monad (replicateM)
89
import Data.Default (def)
910
import Data.Map qualified as Map
11+
import Data.Set (Set)
1012
import Data.Set qualified as Set
1113
import Data.Text qualified as Text
14+
import Data.Vector (Vector)
15+
import Data.Vector qualified as Vec
1216
import Ledger qualified
1317
import Ledger.Ada qualified as Ada
1418
import Ledger.Address (Address, PaymentPubKeyHash (PaymentPubKeyHash))
1519
import Ledger.Address qualified as Address
1620
import Ledger.CardanoWallet qualified as Wallet
1721
import Ledger.Crypto (PubKeyHash)
1822
import Ledger.Tx (TxIn (..), TxInType (..), TxOut (..), TxOutRef (..))
19-
import Ledger.Value (Value)
23+
import Ledger.Value (Value, AssetClass)
2024
import Ledger.Value qualified as Value
2125
import Spec.MockContract (runPABEffectPure)
2226
import Spec.RandomLedger
23-
import Test.QuickCheck (Gen, Property, forAll)
27+
import Test.QuickCheck (Gen, Property, forAll, withMaxSuccess)
2428
import Test.Tasty (TestTree, testGroup)
2529
import Test.Tasty.HUnit (Assertion, assertFailure, testCase, (@?=))
2630
import 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

104109
assertUniqueAssetClasses :: 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

Comments
 (0)