plutus_ledger_api/generators/correct/
v2.rs

1//! Proptest strategies for Plutus V2 types
2//!
3//! These strategies always return valid values.
4use super::primitive::arb_natural;
5use super::v1::{
6    arb_assoc_map, arb_d_cert, arb_payment_pub_key_hash, arb_plutus_interval_posix_time,
7    arb_redeemer, arb_script_purpose, arb_staking_credential, arb_transaction_hash,
8};
9use crate::generators::correct::v1::{
10    arb_address, arb_datum, arb_datum_hash, arb_script_hash, arb_transaction_input, arb_value,
11};
12use crate::v2::datum::OutputDatum;
13use crate::v2::transaction::{ScriptContext, TransactionInfo, TransactionOutput, TxInInfo};
14use proptest::collection::vec;
15use proptest::option;
16use proptest::prelude::{prop_oneof, Just};
17use proptest::strategy::Strategy;
18
19/// Strategy to generate transaction output
20pub fn arb_transaction_output() -> impl Strategy<Value = TransactionOutput> {
21    (
22        arb_address(),
23        arb_value(),
24        arb_output_datum(),
25        option::of(arb_script_hash()),
26    )
27        .prop_map(
28            |(address, value, datum, reference_script)| TransactionOutput {
29                address,
30                value,
31                datum,
32                reference_script,
33            },
34        )
35}
36
37/// Strategy to generate an output datum
38pub fn arb_output_datum() -> impl Strategy<Value = OutputDatum> {
39    prop_oneof![
40        Just(OutputDatum::None),
41        arb_datum_hash().prop_map(OutputDatum::DatumHash),
42        arb_datum().prop_map(OutputDatum::InlineDatum)
43    ]
44}
45
46/// Strategy to generate a TxInInfo
47pub fn arb_tx_in_info() -> impl Strategy<Value = TxInInfo> {
48    (arb_transaction_input(), arb_transaction_output())
49        .prop_map(|(reference, output)| TxInInfo { reference, output })
50}
51
52pub fn arb_transaction_info() -> impl Strategy<Value = TransactionInfo> {
53    (
54        vec(arb_tx_in_info(), 5),
55        vec(arb_tx_in_info(), 5),
56        vec(arb_transaction_output(), 5),
57        arb_value(),
58        arb_value(),
59        vec(arb_d_cert(), 5),
60        arb_assoc_map(arb_staking_credential(), arb_natural(1)),
61        arb_plutus_interval_posix_time(),
62        vec(arb_payment_pub_key_hash(), 5),
63        arb_assoc_map(arb_script_purpose(), arb_redeemer()),
64        arb_assoc_map(arb_datum_hash(), arb_datum()),
65        arb_transaction_hash(),
66    )
67        .prop_map(
68            |(
69                inputs,
70                reference_inputs,
71                outputs,
72                fee,
73                mint,
74                d_cert,
75                wdrl,
76                valid_range,
77                signatories,
78                redeemers,
79                datums,
80                id,
81            )| {
82                TransactionInfo {
83                    inputs,
84                    reference_inputs,
85                    outputs,
86                    fee,
87                    mint,
88                    d_cert,
89                    wdrl,
90                    valid_range,
91                    signatories,
92                    redeemers,
93                    datums,
94                    id,
95                }
96            },
97        )
98}
99
100pub fn arb_script_context() -> impl Strategy<Value = ScriptContext> {
101    (arb_script_purpose(), arb_transaction_info())
102        .prop_map(|(purpose, tx_info)| ScriptContext { purpose, tx_info })
103}