Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions cardano-api/cardano-api.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,7 @@ library gen
Test.Gen.Cardano.Api.Metadata
Test.Gen.Cardano.Api.Orphans
Test.Gen.Cardano.Api.ProtocolParameters
Test.Gen.Cardano.Api.TxOut
Test.Gen.Cardano.Api.Typed
Test.Gen.Cardano.Crypto.Seed
Test.Hedgehog.Golden.ErrorMessage
Expand Down Expand Up @@ -420,6 +421,11 @@ test-suite cardano-api-test
Test.Cardano.Api.Transaction.Autobalance
Test.Cardano.Api.Transaction.Body.Plutus.Scripts
Test.Cardano.Api.TxBody
Test.Cardano.Api.TxOut.Helpers
Test.Cardano.Api.TxOut.Json
Test.Cardano.Api.TxOut.JsonEdgeCases
Test.Cardano.Api.TxOut.JsonErrorCases
Test.Cardano.Api.TxOut.JsonRoundtrip
Test.Cardano.Api.Value

ghc-options:
Expand Down
14 changes: 13 additions & 1 deletion cardano-api/gen/Test/Gen/Cardano/Api/Era.hs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
module Test.Gen.Cardano.Api.Era
( shelleyBasedEraTestConstraints
, conwayEraOnwardsTestConstraints
, genAnyShelleyBasedEra
, genAnyCardanoEra
)
where

Expand All @@ -18,7 +20,9 @@ import Data.Maybe.Strict

import Test.Gen.Cardano.Api.Orphans ()

import Test.QuickCheck
import Hedgehog (Gen)
import Hedgehog.Gen qualified as Gen
import Test.QuickCheck hiding (Gen)

shelleyBasedEraTestConstraints
:: ()
Expand Down Expand Up @@ -50,3 +54,11 @@ conwayEraOnwardsTestConstraints
conwayEraOnwardsTestConstraints = \case
ConwayEraOnwardsConway -> id
ConwayEraOnwardsDijkstra -> id

-- | Generator for any Shelley-based era
genAnyShelleyBasedEra :: Gen AnyShelleyBasedEra
genAnyShelleyBasedEra = Gen.element [minBound .. maxBound]

-- | Generator for any Cardano era
genAnyCardanoEra :: Gen AnyCardanoEra
genAnyCardanoEra = Gen.element [minBound .. maxBound]
185 changes: 185 additions & 0 deletions cardano-api/gen/Test/Gen/Cardano/Api/TxOut.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}

-- | Additional generators for TxOut JSON testing
module Test.Gen.Cardano.Api.TxOut
( -- * Specific Datum Type Generators
genTxOutWithNoDatum
, genTxOutWithDatumHash
, genTxOutWithSupplementalDatum
, genTxOutWithInlineDatum

-- * Invalid JSON Generators
, genConflictingDatumJSON
, genMismatchedInlineDatumHashJSON
, genPartialInlineDatumJSON

-- * Era-specific TxOut generators
, genTxOutForEra
)
where

import Cardano.Api hiding (Value)

import Data.Aeson (Value (..), object, (.=))

import Test.Gen.Cardano.Api.Typed

import Hedgehog (Gen)
import Hedgehog.Gen qualified as Gen

-- | Generate a TxOut with no datum and no reference script
genTxOutWithNoDatum
:: ShelleyBasedEra era
-> Gen (TxOut CtxTx era)
genTxOutWithNoDatum era =
TxOut
<$> genAddressInEra era
<*> genTxOutValue era
<*> pure TxOutDatumNone
<*> pure ReferenceScriptNone

-- | Generate a TxOut with a datum hash (Alonzo+)
genTxOutWithDatumHash
:: forall era
. AlonzoEraOnwards era
-> Gen (TxOut CtxTx era)
genTxOutWithDatumHash w =
alonzoEraOnwardsConstraints w $
TxOut
<$> genAddressInEra sbe
<*> genTxOutValue sbe
<*> (TxOutDatumHash w <$> genHashScriptData)
<*> genReferenceScript sbe
where
sbe :: ShelleyBasedEra era
sbe = convert w

-- | Generate a TxOut with a supplemental datum (Alonzo+, CtxTx only)
genTxOutWithSupplementalDatum
:: forall era
. AlonzoEraOnwards era
-> Gen (TxOut CtxTx era)
genTxOutWithSupplementalDatum w =
alonzoEraOnwardsConstraints w $
TxOut
<$> genAddressInEra sbe
<*> genTxOutValue sbe
<*> (TxOutSupplementalDatum w <$> genHashableScriptData)
<*> genReferenceScript sbe
where
sbe :: ShelleyBasedEra era
sbe = convert w

-- | Generate a TxOut with an inline datum (Babbage+)
genTxOutWithInlineDatum
:: forall era
. BabbageEraOnwards era
-> Gen (TxOut CtxTx era)
genTxOutWithInlineDatum w =
babbageEraOnwardsConstraints w $
TxOut
<$> genAddressInEra sbe
<*> genTxOutValue sbe
<*> (TxOutDatumInline w <$> genHashableScriptData)
<*> genReferenceScript sbe
where
sbe :: ShelleyBasedEra era
sbe = convert w

-- | Generate JSON with conflicting Alonzo and Babbage datum fields
genConflictingDatumJSON :: Gen Value
genConflictingDatumJSON = do
addr <- genAddressInEra ShelleyBasedEraBabbage
val <- genTxOutValue ShelleyBasedEraBabbage
datum1 <- genHashableScriptData
datum2 <- genHashableScriptData
let hash1 = hashScriptDataBytes datum1
let hash2 = hashScriptDataBytes datum2
pure $
object
[ "address" .= addr
, "value" .= val
, "datumhash" .= hash1
, "datum" .= scriptDataToJson ScriptDataJsonDetailedSchema datum1
, "inlineDatumhash" .= hash2
, "inlineDatum" .= scriptDataToJson ScriptDataJsonDetailedSchema datum2
]

-- | Generate JSON with inline datum that doesn't match its hash
genMismatchedInlineDatumHashJSON :: Gen Value
genMismatchedInlineDatumHashJSON = do
addr <- genAddressInEra ShelleyBasedEraBabbage
val <- genTxOutValue ShelleyBasedEraBabbage
datum <- genHashableScriptData
wrongDatum <- Gen.filter (/= datum) genHashableScriptData
let wrongHash = hashScriptDataBytes wrongDatum
pure $
object
[ "address" .= addr
, "value" .= val
, "inlineDatumhash" .= wrongHash
, "inlineDatum" .= scriptDataToJson ScriptDataJsonDetailedSchema datum
]

-- | Generate JSON with only partial inline datum fields
genPartialInlineDatumJSON :: Gen Value
genPartialInlineDatumJSON = do
addr <- genAddressInEra ShelleyBasedEraBabbage
val <- genTxOutValue ShelleyBasedEraBabbage
datum <- genHashableScriptData
let hash = hashScriptDataBytes datum
Gen.choice
[ -- Only hash, no datum
pure $
object
[ "address" .= addr
, "value" .= val
, "inlineDatumhash" .= hash
]
, -- Only datum, no hash
pure $
object
[ "address" .= addr
, "value" .= val
, "inlineDatum" .= scriptDataToJson ScriptDataJsonDetailedSchema datum
]
]

-- | Generate a TxOut for a specific era (using appropriate datum types)
genTxOutForEra
:: ShelleyBasedEra era
-> Gen (TxOut CtxTx era)
genTxOutForEra = \case
ShelleyBasedEraShelley -> genTxOutWithNoDatum ShelleyBasedEraShelley
ShelleyBasedEraAllegra -> genTxOutWithNoDatum ShelleyBasedEraAllegra
ShelleyBasedEraMary -> genTxOutWithNoDatum ShelleyBasedEraMary
ShelleyBasedEraAlonzo ->
Gen.choice
[ genTxOutWithNoDatum ShelleyBasedEraAlonzo
, genTxOutWithDatumHash AlonzoEraOnwardsAlonzo
, genTxOutWithSupplementalDatum AlonzoEraOnwardsAlonzo
]
ShelleyBasedEraBabbage ->
Gen.choice
[ genTxOutWithNoDatum ShelleyBasedEraBabbage
, genTxOutWithDatumHash AlonzoEraOnwardsBabbage
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

, genTxOutWithSupplementalDatum AlonzoEraOnwardsBabbage
, genTxOutWithInlineDatum BabbageEraOnwardsBabbage
]
ShelleyBasedEraConway ->
Gen.choice
[ genTxOutWithNoDatum ShelleyBasedEraConway
, genTxOutWithDatumHash AlonzoEraOnwardsConway
, genTxOutWithSupplementalDatum AlonzoEraOnwardsConway
, genTxOutWithInlineDatum BabbageEraOnwardsConway
]
ShelleyBasedEraDijkstra ->
Gen.choice
[ genTxOutWithNoDatum ShelleyBasedEraDijkstra
, genTxOutWithDatumHash AlonzoEraOnwardsDijkstra
, genTxOutWithSupplementalDatum AlonzoEraOnwardsDijkstra
, genTxOutWithInlineDatum BabbageEraOnwardsDijkstra
]
9 changes: 9 additions & 0 deletions cardano-api/src/Cardano/Api/Era/Internal/Case.hs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}

-- | Era case functions for branching on era types
--
-- DEPRECATION NOTICE: The @case*@ functions in this module are deprecated and will be
-- removed in a future release. They were used for era-based conditional logic but are
-- being phased out in favor of direct pattern matching or other approaches.
--
-- DO NOT add new @case*@ functions to this module. If you need era-based branching,
-- prefer direct pattern matching on era witnesses or use the conversion functions
-- provided by the era system.
module Cardano.Api.Era.Internal.Case
( -- Case on CardanoEra
caseByronOrShelleyBasedEra
Expand Down
Loading
Loading