Skip to content

Commit 2e4b66f

Browse files
UnisayPhilip DiSarro
andcommitted
Add ScriptContext Builder testlib and refactor LinearVesting tests
Introduce a ScriptContext builder module in plutus-ledger-api testlib that provides composable combinators for constructing ScriptContext values in tests. This replaces hand-crafted script contexts with a declarative builder pattern using lenses. Key changes: - Add PlutusLedgerApi.Test.ScriptContextBuilder.Builder with combinators for minting, spending, certifying, rewarding, and proposing contexts - Add PlutusLedgerApi.Test.ScriptContextBuilder.Lenses with TH-generated lenses for all V3 ledger types - Refactor LinearVesting benchmark tests to use the new builder - Fix AsData destructSum-manual test to use manual IsData instances instead of asData, regenerating golden files Based on work from PR #7562. Co-authored-by: Philip DiSarro <philip-disarro@users.noreply.github.com>
1 parent aa3766c commit 2e4b66f

File tree

7 files changed

+884
-49
lines changed

7 files changed

+884
-49
lines changed

plutus-benchmark/linear-vesting/src/LinearVesting/Test.hs

Lines changed: 38 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -9,72 +9,62 @@
99
module LinearVesting.Test where
1010

1111
import PlutusTx
12-
import PlutusTx.Prelude
12+
import PlutusTx.Prelude hiding ((<>))
1313

1414
import LinearVesting.Validator (VestingDatum (..), VestingRedeemer (..), validatorCode)
15-
import PlutusLedgerApi.Data.V3
15+
import PlutusLedgerApi.Data.V3 qualified as PV3D
16+
import PlutusLedgerApi.Test.ScriptContextBuilder.Builder
17+
( buildScriptContext
18+
, withAddress
19+
, withInlineDatum
20+
, withOutRef
21+
, withSigner
22+
, withSpendingScript
23+
, withValidRange
24+
)
1625
import PlutusLedgerApi.V1.Data.Value (assetClass)
17-
import PlutusTx.Data.AssocMap qualified as Map
18-
import PlutusTx.Data.List qualified as List
26+
import PlutusLedgerApi.V3 qualified as PV3
27+
import Prelude ((<>))
1928

2029
validatorCodeFullyApplied :: CompiledCode BuiltinUnit
2130
validatorCodeFullyApplied =
2231
validatorCode `unsafeApplyCode` liftCodeDef (toBuiltinData testScriptContext)
2332

24-
testScriptContext :: ScriptContext
33+
testScriptContext :: PV3.ScriptContext
2534
testScriptContext =
26-
ScriptContext
27-
{ scriptContextTxInfo = txInfo
28-
, scriptContextRedeemer
29-
, scriptContextScriptInfo
30-
}
35+
buildScriptContext
36+
( withValidRange
37+
( PV3.Interval
38+
(PV3.LowerBound (PV3.Finite 110) True)
39+
(PV3.UpperBound (PV3.Finite 1100) True)
40+
)
41+
<> withSigner testBeneficiaryPKH
42+
<> withSpendingScript
43+
(toBuiltinData FullUnlock)
44+
( withOutRef (PV3.TxOutRef txOutRefId txOutRefIdx)
45+
<> withAddress (PV3.Address (PV3.ScriptCredential scriptHash) Nothing)
46+
<> withInlineDatum (toBuiltinData testVestingDatum)
47+
)
48+
)
3149
where
32-
txInfo =
33-
TxInfo
34-
{ txInfoInputs = mempty
35-
, txInfoReferenceInputs = mempty
36-
, txInfoOutputs = mempty
37-
, txInfoTxCerts = mempty
38-
, txInfoRedeemers = Map.empty
39-
, txInfoVotes = Map.empty
40-
, txInfoProposalProcedures = mempty
41-
, txInfoCurrentTreasuryAmount = Nothing
42-
, txInfoTreasuryDonation = Nothing
43-
, txInfoFee = 0
44-
, txInfoMint = emptyMintValue
45-
, txInfoWdrl = Map.empty
46-
, txInfoValidRange =
47-
Interval
48-
(LowerBound (Finite 110) True)
49-
(UpperBound (Finite 1100) True)
50-
, txInfoSignatories = List.singleton testBeneficiaryPKH
51-
, txInfoData = Map.empty
52-
, txInfoId = "058fdca70be67c74151cea3846be7f73342d92c0090b62c1052e6790ad83f145"
53-
}
54-
55-
scriptContextRedeemer :: Redeemer
56-
scriptContextRedeemer = Redeemer (toBuiltinData FullUnlock)
57-
58-
scriptContextScriptInfo :: ScriptInfo
59-
scriptContextScriptInfo =
60-
SpendingScript (TxOutRef txOutRefId txOutRefIdx) (Just datum)
61-
where
62-
txOutRefId = "058fdca70be67c74151cea3846be7f73342d92c0090b62c1052e6790ad83f145"
63-
txOutRefIdx = 0
64-
datum :: Datum
65-
datum = Datum (toBuiltinData testVestingDatum)
50+
txOutRefId :: PV3.TxId
51+
txOutRefId = "058fdca70be67c74151cea3846be7f73342d92c0090b62c1052e6790ad83f145"
52+
txOutRefIdx :: Integer
53+
txOutRefIdx = 0
54+
scriptHash :: PV3.ScriptHash
55+
scriptHash = PV3.ScriptHash "deadbeef"
6656

6757
testVestingDatum :: VestingDatum
6858
testVestingDatum =
6959
VestingDatum
70-
{ beneficiary = Address (PubKeyCredential testBeneficiaryPKH) Nothing
71-
, vestingAsset = assetClass (CurrencySymbol "$") (TokenName "test-asset")
60+
{ beneficiary = PV3D.Address (PV3D.PubKeyCredential testBeneficiaryPKH) Nothing
61+
, vestingAsset = assetClass (PV3D.CurrencySymbol "$") (PV3D.TokenName "test-asset")
7262
, totalVestingQty = 1000
7363
, vestingPeriodStart = 0
7464
, vestingPeriodEnd = 100
7565
, firstUnlockPossibleAfter = 10
7666
, totalInstallments = 10
7767
}
7868

79-
testBeneficiaryPKH :: PubKeyHash
80-
testBeneficiaryPKH = PubKeyHash ""
69+
testBeneficiaryPKH :: PV3.PubKeyHash
70+
testBeneficiaryPKH = PV3.PubKeyHash ""

plutus-benchmark/plutus-benchmark.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,8 +778,9 @@ library linear-vesting-internal
778778
LinearVesting.Validator
779779

780780
build-depends:
781-
, base >=4.9 && <5
781+
, base >=4.9 && <5
782782
, plutus-ledger-api
783+
, plutus-ledger-api:plutus-ledger-api-testlib
783784
, plutus-tx
784785
, plutus-tx-plugin
785786

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
### Added
2+
3+
- Added `ScriptContextBuilder` test utility (`PlutusLedgerApi.Test.ScriptContextBuilder`) to `plutus-ledger-api-testlib` for constructing realistic `ScriptContext` values in tests using a composable builder pattern.

plutus-ledger-api/plutus-ledger-api.cabal

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,9 @@ library plutus-ledger-api-testlib
137137
PlutusLedgerApi.Test.Common.EvaluationContext
138138
PlutusLedgerApi.Test.EvaluationEvent
139139
PlutusLedgerApi.Test.Examples
140+
PlutusLedgerApi.Test.ScriptContextBuilder.Builder
141+
PlutusLedgerApi.Test.ScriptContextBuilder.Lenses
142+
PlutusLedgerApi.Test.ScriptContextBuilder.Lenses.TH
140143
PlutusLedgerApi.Test.Scripts
141144
PlutusLedgerApi.Test.V1.Data.EvaluationContext
142145
PlutusLedgerApi.Test.V1.Data.Value
@@ -156,13 +159,15 @@ library plutus-ledger-api-testlib
156159
, base64-bytestring
157160
, bytestring
158161
, containers
162+
, lens
159163
, plutus-core ^>=1.59
160164
, plutus-core:plutus-core-testlib
161165
, plutus-ledger-api ^>=1.59
162166
, plutus-tx ^>=1.59
163167
, prettyprinter
164168
, QuickCheck
165169
, serialise
170+
, template-haskell
166171
, text
167172

168173
test-suite plutus-ledger-api-test

0 commit comments

Comments
 (0)