Skip to content

Commit 53b0ca8

Browse files
committed
test(standing_bid): fix positive test for NewBid redeemer
1 parent 2e7ff00 commit 53b0ca8

File tree

6 files changed

+70
-27
lines changed

6 files changed

+70
-27
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ build:
77
cabal v2-build all
88

99
test:
10-
cabal v2-test
10+
cabal v2-test --test-show-details=streaming --test-options="--quickcheck-tests=100"
1111

1212
repl:
1313
cabal v2-repl hydra-auction-onchain --ghc-options '-Wno-missing-import-lists'

src/HydraAuctionOnchain/Types/BidTerms.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ bidderSignatureMessage
7373
)
7474
bidderSignatureMessage = phoistAcyclic $
7575
plam $ \auctionCs bidPrice bidderPkh ->
76-
(pserialise # auctionCs) <> (pserialise # bidPrice) <> (pserialise # bidderPkh)
76+
(pserialise # auctionCs) <> (pserialise # bidderPkh) <> (pserialise # bidPrice)
7777

7878
sellerSignatureMessage :: Term s (PCurrencySymbol :--> PByteString :--> PByteString)
7979
sellerSignatureMessage = phoistAcyclic $

test/Spec/HydraAuctionOnchain/Helpers.hs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module Spec.HydraAuctionOnchain.Helpers
22
( hashVerificationKey
3+
, intervalFiniteClosedOpen
34
, mkStandingBidTokenValue
45
, serialise
56
) where
@@ -10,7 +11,15 @@ import Data.ByteArray (convert)
1011
import Data.ByteString (ByteString)
1112
import PlutusLedgerApi.V1 (CurrencySymbol, Value)
1213
import PlutusLedgerApi.V1.Value qualified as Value (singleton)
13-
import PlutusLedgerApi.V2 (BuiltinByteString, PubKeyHash (PubKeyHash), toBuiltin)
14+
import PlutusLedgerApi.V2
15+
( BuiltinByteString
16+
, Extended (Finite)
17+
, Interval (Interval)
18+
, LowerBound (LowerBound)
19+
, PubKeyHash (PubKeyHash)
20+
, UpperBound (UpperBound)
21+
, toBuiltin
22+
)
1423
import PlutusTx (ToData, toBuiltinData)
1524
import PlutusTx.Builtins (serialiseData)
1625

@@ -28,6 +37,10 @@ hashVerificationKey vkey =
2837
. convert
2938
$ hash @PublicKey @Blake2b_224 vkey
3039

40+
intervalFiniteClosedOpen :: a -> a -> Interval a
41+
intervalFiniteClosedOpen a b =
42+
Interval (LowerBound (Finite a) True) (UpperBound (Finite b) False)
43+
3144
mkStandingBidTokenValue :: CurrencySymbol -> Value
3245
mkStandingBidTokenValue cs = Value.singleton cs "STANDING_BID" 1
3346

test/Spec/HydraAuctionOnchain/QuickCheck/Gen.hs

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ import Test.QuickCheck
4545
, chooseInt
4646
, chooseInteger
4747
, liftArbitrary
48-
, suchThat
4948
, vector
5049
)
5150

@@ -62,6 +61,9 @@ genKeyPair =
6261
let (skey, _) = withDRG (drgNewTest seed) generateSecretKey
6362
in KeyPair skey $ toPublic skey
6463

64+
genIntegerGreaterThan :: Integer -> Gen Integer
65+
genIntegerGreaterThan a = arbitrary @(Positive Integer) <&> \(Positive b) -> a + b
66+
6567
genTxInfoTemplate :: Gen TxInfo
6668
genTxInfoTemplate = do
6769
txInfoFeeAda <- arbitrary @Integer
@@ -82,15 +84,29 @@ genTxInfoTemplate = do
8284
, txInfoId
8385
}
8486

85-
genValidBidTerms :: CurrencySymbol -> AuctionTerms -> KeyPair -> KeyPair -> Gen BidTerms
86-
genValidBidTerms auctionCs auctionTerms sellerKeys bidderKeys = do
87+
genValidBidTerms
88+
:: CurrencySymbol
89+
-> AuctionTerms
90+
-> KeyPair
91+
-> KeyPair
92+
-> Maybe Integer
93+
-> Gen BidTerms
94+
genValidBidTerms auctionCs auctionTerms sellerKeys bidderKeys mOldBidPrice = do
8795
let (bi'BidderVk, bi'BidderPkh) = hashVerificationKey $ vkey bidderKeys
8896
let bt'Bidder = BidderInfo {..}
89-
bt'BidPrice <- arbitrary @Integer `suchThat` (\x -> x > at'StartingBid auctionTerms)
97+
bt'BidPrice <- genBidPrice
9098
let bt'SellerSignature = sellerSignature bi'BidderVk
9199
let bt'BidderSignature = bidderSignature bt'BidPrice bi'BidderPkh
92100
pure BidTerms {..}
93101
where
102+
genBidPrice :: Gen Integer
103+
genBidPrice =
104+
case mOldBidPrice of
105+
Just oldBidPrice ->
106+
genIntegerGreaterThan $ oldBidPrice + at'MinBidIncrement auctionTerms
107+
Nothing ->
108+
genIntegerGreaterThan $ at'StartingBid auctionTerms
109+
94110
sellerSignature :: BuiltinByteString -> BuiltinByteString
95111
sellerSignature bidderVkey =
96112
signUsingKeyPair sellerKeys $
@@ -110,7 +126,7 @@ genValidBidState
110126
genValidBidState auctionCs auctionTerms sellerKeys bidderKeys =
111127
StandingBidState
112128
<$> liftArbitrary
113-
(genValidBidTerms auctionCs auctionTerms sellerKeys bidderKeys)
129+
(genValidBidTerms auctionCs auctionTerms sellerKeys bidderKeys Nothing)
114130

115131
genValidNewBidState
116132
:: StandingBidState
@@ -120,15 +136,14 @@ genValidNewBidState
120136
-> KeyPair
121137
-> Gen StandingBidState
122138
genValidNewBidState oldBidState auctionCs auctionTerms sellerKeys bidderKeys =
123-
case oldBidState of
124-
StandingBidState Nothing ->
125-
genValidBidState auctionCs auctionTerms sellerKeys bidderKeys
126-
StandingBidState (Just oldBidTerms) -> do
127-
newBidPrice <- arbitrary @Integer `suchThat` (\x -> x >= at'MinBidIncrement auctionTerms)
128-
pure . StandingBidState . Just $
129-
oldBidTerms
130-
{ bt'BidPrice = newBidPrice
131-
}
139+
StandingBidState . Just
140+
<$> genValidBidTerms auctionCs auctionTerms sellerKeys bidderKeys oldBidPrice
141+
where
142+
oldBidPrice :: Maybe Integer
143+
oldBidPrice =
144+
case oldBidState of
145+
StandingBidState Nothing -> Nothing
146+
StandingBidState (Just oldBidTerms) -> Just $ bt'BidPrice oldBidTerms
132147

133148
genValidAuctionTerms :: PublicKey -> Gen AuctionTerms
134149
genValidAuctionTerms vkey = do
@@ -145,10 +160,10 @@ genValidAuctionTerms vkey = do
145160
let at'Cleanup = at'PurchaseDeadline + penaltyPeriod
146161

147162
let minAuctionFeePerDelegate = 2_000_000
148-
at'AuctionFeePerDelegate <- arbitrary @Integer `suchThat` (\x -> x > minAuctionFeePerDelegate)
163+
at'AuctionFeePerDelegate <- genIntegerGreaterThan minAuctionFeePerDelegate
149164

150165
let minStartingBid = at'AuctionFeePerDelegate * fromIntegral (length at'Delegates)
151-
at'StartingBid <- arbitrary @Integer `suchThat` (\x -> x > minStartingBid)
166+
at'StartingBid <- genIntegerGreaterThan minStartingBid
152167

153168
Positive at'MinBidIncrement <- arbitrary @(Positive Integer)
154169
NonNegative at'MinDepositAmount <- arbitrary @(NonNegative Integer)

test/Spec/HydraAuctionOnchain/Types/AuctionTerms.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1+
{-# LANGUAGE RecordWildCards #-}
12
{-# LANGUAGE TemplateHaskell #-}
23
{-# LANGUAGE UndecidableInstances #-}
34
{-# OPTIONS_GHC -Wno-orphans #-}
45

56
module Spec.HydraAuctionOnchain.Types.AuctionTerms
67
( AuctionTerms (..)
8+
, biddingPeriod
79
) where
810

911
import HydraAuctionOnchain.Types.AuctionTerms (PAuctionTerms)
1012
import Plutarch.DataRepr (DerivePConstantViaData (DerivePConstantViaData))
1113
import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted))
12-
import PlutusLedgerApi.V2 (BuiltinByteString, POSIXTime, PubKeyHash, Value)
14+
import PlutusLedgerApi.V2 (BuiltinByteString, POSIXTime, POSIXTimeRange, PubKeyHash, Value)
1315
import PlutusTx (makeIsDataIndexed)
16+
import Spec.HydraAuctionOnchain.Helpers (intervalFiniteClosedOpen)
1417

1518
data AuctionTerms = AuctionTerms
1619
{ at'AuctionLot :: Value
@@ -37,3 +40,10 @@ deriving via
3740

3841
instance PUnsafeLiftDecl PAuctionTerms where
3942
type PLifted PAuctionTerms = AuctionTerms
43+
44+
--------------------------------------------------------------------------------
45+
-- Auction Lifecycle
46+
--------------------------------------------------------------------------------
47+
48+
biddingPeriod :: AuctionTerms -> POSIXTimeRange
49+
biddingPeriod AuctionTerms {..} = intervalFiniteClosedOpen at'BiddingStart at'BiddingEnd

test/Spec/HydraAuctionOnchain/Validators/StandingBid.hs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import Spec.HydraAuctionOnchain.QuickCheck.Gen
4040
, genValidNewBidState
4141
, vkey
4242
)
43-
import Spec.HydraAuctionOnchain.Types.AuctionTerms (AuctionTerms)
43+
import Spec.HydraAuctionOnchain.Types.AuctionTerms (AuctionTerms, biddingPeriod)
4444
import Spec.HydraAuctionOnchain.Types.Redeemers (StandingBidRedeemer (NewBidRedeemer))
4545
import Spec.HydraAuctionOnchain.Types.StandingBidState (StandingBidState)
4646
import Test.QuickCheck (Arbitrary (arbitrary), Property)
@@ -57,10 +57,14 @@ spec =
5757
]
5858
]
5959

60-
prop_newBid_validInput_succeeds :: TestContext -> Property
60+
--------------------------------------------------------------------------------
61+
-- NewBid
62+
--------------------------------------------------------------------------------
63+
64+
prop_newBid_validInput_succeeds :: NewBidTestContext -> Property
6165
prop_newBid_validInput_succeeds testContext = shouldSucceed $ testNewBid testContext
6266

63-
data TestContext = TestContext
67+
data NewBidTestContext = NewBidTestContext
6468
{ auctionCs :: CurrencySymbol
6569
, auctionTerms :: AuctionTerms
6670
, oldBidState :: StandingBidState
@@ -71,7 +75,7 @@ data TestContext = TestContext
7175
}
7276
deriving stock (Show, Eq)
7377

74-
instance Arbitrary TestContext where
78+
instance Arbitrary NewBidTestContext where
7579
arbitrary = do
7680
GenCurrencySymbol auctionCs <- arbitrary @(GenCurrencySymbol 'WithoutAdaSymbol)
7781
(sellerKeys, bidderKeys) <- (,) <$> genKeyPair <*> genKeyPair
@@ -81,10 +85,10 @@ instance Arbitrary TestContext where
8185
txInfoTemplate <- genTxInfoTemplate
8286
standingBidInputOref <- arbitrary @TxOutRef
8387
scriptAddress <- flip Address Nothing . ScriptCredential <$> arbitrary @ScriptHash
84-
pure TestContext {..}
88+
pure NewBidTestContext {..}
8589

86-
testNewBid :: TestContext -> Script
87-
testNewBid TestContext {..} =
90+
testNewBid :: NewBidTestContext -> Script
91+
testNewBid NewBidTestContext {..} =
8892
let
8993
standingBidTokenValue :: Value
9094
standingBidTokenValue = mkStandingBidTokenValue auctionCs
@@ -124,6 +128,7 @@ testNewBid TestContext {..} =
124128
txInfoTemplate
125129
{ txInfoInputs = singleton standingBidInput
126130
, txInfoOutputs = singleton standingBidOutput
131+
, txInfoValidRange = biddingPeriod auctionTerms
127132
, txInfoRedeemers = AMap.singleton scriptPurpose redeemer
128133
}
129134
, scriptContextPurpose = scriptPurpose

0 commit comments

Comments
 (0)