Skip to content

Commit 4556f6a

Browse files
committed
test: add golden tests for deriveEq generated code
Add golden TH tests capturing the exact generated Eq instances for every type where manual instances were replaced with deriveEq. This covers 42 types in plutus-ledger-api (V1/V2/V3, Original and Data variants) and 2 types in plutus-tx (Rational, These). These tests will detect any unintended changes to the generated equality code.
1 parent ac645ab commit 4556f6a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+382
-0
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ test-suite plutus-ledger-api-test
178178
Spec.Data.CostModelParams
179179
Spec.Data.Eval
180180
Spec.Data.Versions
181+
Spec.Eq.Golden
181182
Spec.Eval
182183
Spec.Interval
183184
Spec.ScriptDecodeError

plutus-ledger-api/test/Spec.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Spec.CostModelParams qualified
1515
import Spec.Data.CostModelParams qualified
1616
import Spec.Data.Eval qualified
1717
import Spec.Data.Versions qualified
18+
import Spec.Eq.Golden qualified
1819
import Spec.Eval qualified
1920
import Spec.Interval qualified
2021
import Spec.ScriptDecodeError qualified
@@ -223,4 +224,5 @@ tests =
223224
, Data.Value.test_Value
224225
]
225226
]
227+
, Spec.Eq.Golden.eqGoldenTests
226228
]
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
{-# LANGUAGE TemplateHaskell #-}
2+
{-# LANGUAGE TypeApplications #-}
3+
4+
{-| Golden tests for deriveEq instances in plutus-ledger-api.
5+
These tests capture the exact generated code for types where manual Eq instances
6+
were replaced with deriveEq, providing confidence that derived instances match
7+
the original manual implementations. -}
8+
module Spec.Eq.Golden (eqGoldenTests) where
9+
10+
import PlutusTx.Eq (deriveEq)
11+
import PlutusTx.Test.Golden (goldenCodeGen)
12+
import Test.Tasty (TestTree)
13+
import Test.Tasty.Extras (runTestNested)
14+
15+
-- V1 types
16+
import PlutusLedgerApi.V1.Address qualified as V1
17+
import PlutusLedgerApi.V1.Contexts qualified as V1
18+
import PlutusLedgerApi.V1.Credential qualified as V1
19+
import PlutusLedgerApi.V1.DCert qualified as V1
20+
import PlutusLedgerApi.V1.Interval qualified as V1
21+
22+
-- V1 Data types
23+
import PlutusLedgerApi.V1.Data.Address qualified as V1D
24+
import PlutusLedgerApi.V1.Data.Contexts qualified as V1D
25+
import PlutusLedgerApi.V1.Data.Credential qualified as V1D
26+
import PlutusLedgerApi.V1.Data.DCert qualified as V1D
27+
28+
-- V2 types
29+
import PlutusLedgerApi.V2.Contexts qualified as V2
30+
import PlutusLedgerApi.V2.Tx qualified as V2
31+
32+
-- V2 Data types
33+
import PlutusLedgerApi.V2.Data.Contexts qualified as V2D
34+
import PlutusLedgerApi.V2.Data.Tx qualified as V2D
35+
36+
-- V3 types
37+
import PlutusLedgerApi.V3.Contexts qualified as V3
38+
import PlutusLedgerApi.V3.Tx qualified as V3
39+
40+
-- V3 Data types
41+
import PlutusLedgerApi.V3.Data.Contexts qualified as V3D
42+
import PlutusLedgerApi.V3.Data.Tx qualified as V3D
43+
44+
eqGoldenTests :: TestTree
45+
eqGoldenTests =
46+
runTestNested
47+
["test", "Spec", "Eq", "Golden"]
48+
[ -- V1 types
49+
$(goldenCodeGen "V1.Address" (deriveEq ''V1.Address))
50+
, $(goldenCodeGen "V1.TxInInfo" (deriveEq ''V1.TxInInfo))
51+
, $(goldenCodeGen "V1.ScriptPurpose" (deriveEq ''V1.ScriptPurpose))
52+
, $(goldenCodeGen "V1.TxInfo" (deriveEq ''V1.TxInfo))
53+
, $(goldenCodeGen "V1.ScriptContext" (deriveEq ''V1.ScriptContext))
54+
, $(goldenCodeGen "V1.Credential" (deriveEq ''V1.Credential))
55+
, $(goldenCodeGen "V1.StakingCredential" (deriveEq ''V1.StakingCredential))
56+
, $(goldenCodeGen "V1.DCert" (deriveEq ''V1.DCert))
57+
, $(goldenCodeGen "V1.Extended" (deriveEq ''V1.Extended))
58+
, $(goldenCodeGen "V1.TxOutRef" (deriveEq ''V1.TxOutRef))
59+
, $(goldenCodeGen "V1.TxOut" (deriveEq ''V1.TxOut))
60+
, -- V1 Data types
61+
$(goldenCodeGen "V1D.Address" (deriveEq ''V1D.Address))
62+
, $(goldenCodeGen "V1D.TxInInfo" (deriveEq ''V1D.TxInInfo))
63+
, $(goldenCodeGen "V1D.ScriptPurpose" (deriveEq ''V1D.ScriptPurpose))
64+
, $(goldenCodeGen "V1D.TxInfo" (deriveEq ''V1D.TxInfo))
65+
, $(goldenCodeGen "V1D.ScriptContext" (deriveEq ''V1D.ScriptContext))
66+
, $(goldenCodeGen "V1D.Credential" (deriveEq ''V1D.Credential))
67+
, $(goldenCodeGen "V1D.StakingCredential" (deriveEq ''V1D.StakingCredential))
68+
, $(goldenCodeGen "V1D.DCert" (deriveEq ''V1D.DCert))
69+
, $(goldenCodeGen "V1D.TxOutRef" (deriveEq ''V1D.TxOutRef))
70+
, $(goldenCodeGen "V1D.TxOut" (deriveEq ''V1D.TxOut))
71+
, -- V2 Original types
72+
$(goldenCodeGen "V2.TxInInfo" (deriveEq ''V2.TxInInfo))
73+
, $(goldenCodeGen "V2.OutputDatum" (deriveEq ''V2.OutputDatum))
74+
, $(goldenCodeGen "V2.TxOut" (deriveEq ''V2.TxOut))
75+
, -- V2 Data types
76+
$(goldenCodeGen "V2D.TxInInfo" (deriveEq ''V2D.TxInInfo))
77+
, $(goldenCodeGen "V2D.OutputDatum" (deriveEq ''V2D.OutputDatum))
78+
, $(goldenCodeGen "V2D.TxOut" (deriveEq ''V2D.TxOut))
79+
, -- V3 Original types
80+
$(goldenCodeGen "V3.DRep" (deriveEq ''V3.DRep))
81+
, $(goldenCodeGen "V3.Delegatee" (deriveEq ''V3.Delegatee))
82+
, $(goldenCodeGen "V3.TxCert" (deriveEq ''V3.TxCert))
83+
, $(goldenCodeGen "V3.Voter" (deriveEq ''V3.Voter))
84+
, $(goldenCodeGen "V3.Vote" (deriveEq ''V3.Vote))
85+
, $(goldenCodeGen "V3.GovernanceActionId" (deriveEq ''V3.GovernanceActionId))
86+
, $(goldenCodeGen "V3.Constitution" (deriveEq ''V3.Constitution))
87+
, $(goldenCodeGen "V3.ProtocolVersion" (deriveEq ''V3.ProtocolVersion))
88+
, $(goldenCodeGen "V3.TxInInfo" (deriveEq ''V3.TxInInfo))
89+
, $(goldenCodeGen "V3.TxOutRef" (deriveEq ''V3.TxOutRef))
90+
, -- V3 Data types
91+
$(goldenCodeGen "V3D.DRep" (deriveEq ''V3D.DRep))
92+
, $(goldenCodeGen "V3D.Delegatee" (deriveEq ''V3D.Delegatee))
93+
, $(goldenCodeGen "V3D.TxCert" (deriveEq ''V3D.TxCert))
94+
, $(goldenCodeGen "V3D.Voter" (deriveEq ''V3D.Voter))
95+
, $(goldenCodeGen "V3D.Vote" (deriveEq ''V3D.Vote))
96+
, $(goldenCodeGen "V3D.GovernanceActionId" (deriveEq ''V3D.GovernanceActionId))
97+
, $(goldenCodeGen "V3D.Constitution" (deriveEq ''V3D.Constitution))
98+
, $(goldenCodeGen "V3D.ProtocolVersion" (deriveEq ''V3D.ProtocolVersion))
99+
, $(goldenCodeGen "V3D.TxInInfo" (deriveEq ''V3D.TxInInfo))
100+
, $(goldenCodeGen "V3D.TxOutRef" (deriveEq ''V3D.TxOutRef))
101+
]
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
instance PlutusTx.Eq.Class.Eq PlutusLedgerApi.V1.Address.Address
2+
where {(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Address.Address l1l_0
3+
l2l_1) (PlutusLedgerApi.V1.Address.Address r1r_2
4+
r2r_3) = (l1l_0 PlutusTx.Eq.Class.== r1r_2) PlutusTx.Bool.&& (l2l_1 PlutusTx.Eq.Class.== r2r_3);
5+
{-# INLINABLE (PlutusTx.Eq.Class.==) #-}}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
instance PlutusTx.Eq.Class.Eq PlutusLedgerApi.V1.Credential.Credential
2+
where {(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Credential.PubKeyCredential l1l_0) (PlutusLedgerApi.V1.Credential.PubKeyCredential r1r_1) = l1l_0 PlutusTx.Eq.Class.== r1r_1
3+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Credential.ScriptCredential l1l_2) (PlutusLedgerApi.V1.Credential.ScriptCredential r1r_3) = l1l_2 PlutusTx.Eq.Class.== r1r_3
4+
(PlutusTx.Eq.Class.==) _ _ = GHC.Types.False;
5+
{-# INLINABLE (PlutusTx.Eq.Class.==) #-}}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
instance PlutusTx.Eq.Class.Eq PlutusLedgerApi.V1.DCert.DCert
2+
where {(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.DCert.DCertDelegRegKey l1l_0) (PlutusLedgerApi.V1.DCert.DCertDelegRegKey r1r_1) = l1l_0 PlutusTx.Eq.Class.== r1r_1
3+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.DCert.DCertDelegDeRegKey l1l_2) (PlutusLedgerApi.V1.DCert.DCertDelegDeRegKey r1r_3) = l1l_2 PlutusTx.Eq.Class.== r1r_3
4+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.DCert.DCertDelegDelegate l1l_4
5+
l2l_5) (PlutusLedgerApi.V1.DCert.DCertDelegDelegate r1r_6
6+
r2r_7) = (l1l_4 PlutusTx.Eq.Class.== r1r_6) PlutusTx.Bool.&& (l2l_5 PlutusTx.Eq.Class.== r2r_7)
7+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.DCert.DCertPoolRegister l1l_8
8+
l2l_9) (PlutusLedgerApi.V1.DCert.DCertPoolRegister r1r_10
9+
r2r_11) = (l1l_8 PlutusTx.Eq.Class.== r1r_10) PlutusTx.Bool.&& (l2l_9 PlutusTx.Eq.Class.== r2r_11)
10+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.DCert.DCertPoolRetire l1l_12
11+
l2l_13) (PlutusLedgerApi.V1.DCert.DCertPoolRetire r1r_14
12+
r2r_15) = (l1l_12 PlutusTx.Eq.Class.== r1r_14) PlutusTx.Bool.&& (l2l_13 PlutusTx.Eq.Class.== r2r_15)
13+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.DCert.DCertGenesis) (PlutusLedgerApi.V1.DCert.DCertGenesis) = GHC.Types.True
14+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.DCert.DCertMir) (PlutusLedgerApi.V1.DCert.DCertMir) = GHC.Types.True
15+
(PlutusTx.Eq.Class.==) _ _ = GHC.Types.False;
16+
{-# INLINABLE (PlutusTx.Eq.Class.==) #-}}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
instance PlutusTx.Eq.Class.Eq a_0 => PlutusTx.Eq.Class.Eq (PlutusLedgerApi.V1.Interval.Extended a_0)
2+
where {(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Interval.NegInf) (PlutusLedgerApi.V1.Interval.NegInf) = GHC.Types.True
3+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Interval.Finite l1l_1) (PlutusLedgerApi.V1.Interval.Finite r1r_2) = l1l_1 PlutusTx.Eq.Class.== r1r_2
4+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Interval.PosInf) (PlutusLedgerApi.V1.Interval.PosInf) = GHC.Types.True
5+
(PlutusTx.Eq.Class.==) _ _ = GHC.Types.False;
6+
{-# INLINABLE (PlutusTx.Eq.Class.==) #-}}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
instance PlutusTx.Eq.Class.Eq PlutusLedgerApi.V1.Contexts.ScriptContext
2+
where {(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Contexts.ScriptContext l1l_0
3+
l2l_1) (PlutusLedgerApi.V1.Contexts.ScriptContext r1r_2
4+
r2r_3) = (l1l_0 PlutusTx.Eq.Class.== r1r_2) PlutusTx.Bool.&& (l2l_1 PlutusTx.Eq.Class.== r2r_3);
5+
{-# INLINABLE (PlutusTx.Eq.Class.==) #-}}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
instance PlutusTx.Eq.Class.Eq PlutusLedgerApi.V1.Contexts.ScriptPurpose
2+
where {(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Contexts.Minting l1l_0) (PlutusLedgerApi.V1.Contexts.Minting r1r_1) = l1l_0 PlutusTx.Eq.Class.== r1r_1
3+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Contexts.Spending l1l_2) (PlutusLedgerApi.V1.Contexts.Spending r1r_3) = l1l_2 PlutusTx.Eq.Class.== r1r_3
4+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Contexts.Rewarding l1l_4) (PlutusLedgerApi.V1.Contexts.Rewarding r1r_5) = l1l_4 PlutusTx.Eq.Class.== r1r_5
5+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Contexts.Certifying l1l_6) (PlutusLedgerApi.V1.Contexts.Certifying r1r_7) = l1l_6 PlutusTx.Eq.Class.== r1r_7
6+
(PlutusTx.Eq.Class.==) _ _ = GHC.Types.False;
7+
{-# INLINABLE (PlutusTx.Eq.Class.==) #-}}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
instance PlutusTx.Eq.Class.Eq PlutusLedgerApi.V1.Credential.StakingCredential
2+
where {(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Credential.StakingHash l1l_0) (PlutusLedgerApi.V1.Credential.StakingHash r1r_1) = l1l_0 PlutusTx.Eq.Class.== r1r_1
3+
(PlutusTx.Eq.Class.==) (PlutusLedgerApi.V1.Credential.StakingPtr l1l_2
4+
l2l_3
5+
l3l_4) (PlutusLedgerApi.V1.Credential.StakingPtr r1r_5
6+
r2r_6
7+
r3r_7) = (l1l_2 PlutusTx.Eq.Class.== r1r_5) PlutusTx.Bool.&& ((l2l_3 PlutusTx.Eq.Class.== r2r_6) PlutusTx.Bool.&& (l3l_4 PlutusTx.Eq.Class.== r3r_7))
8+
(PlutusTx.Eq.Class.==) _ _ = GHC.Types.False;
9+
{-# INLINABLE (PlutusTx.Eq.Class.==) #-}}

0 commit comments

Comments
 (0)