196 lines
5.6 KiB
Rust
196 lines
5.6 KiB
Rust
use num_bigint::ToBigInt;
|
|
use pallas_codec::utils::MaybeIndefArray;
|
|
use uplc::{
|
|
ast::{Constant, Name, Term, Type},
|
|
parser::term,
|
|
Constr, PlutusData,
|
|
};
|
|
|
|
// Examples sourced from https://github.com/input-output-hk/plutus/issues/4751#issuecomment-1538377273
|
|
|
|
fn round_trip(old_term: Term<Name>, pp: &str) {
|
|
//assert_eq!(old_term.to_pretty(), pp);
|
|
let new_term = term(pp).expect("failed to parse");
|
|
assert_eq!(new_term, old_term);
|
|
}
|
|
|
|
#[test]
|
|
fn constant_list_integer() {
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::ProtoList(
|
|
Type::Integer,
|
|
vec![
|
|
Constant::Integer(0.to_bigint().unwrap()),
|
|
Constant::Integer(1.to_bigint().unwrap()),
|
|
Constant::Integer(2.to_bigint().unwrap()),
|
|
],
|
|
)
|
|
.into(),
|
|
),
|
|
"(con (list integer) [0, 1, 2])",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn constant_pair_bool_bytestring() {
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::ProtoPair(
|
|
Type::Bool,
|
|
Type::ByteString,
|
|
Constant::Bool(true).into(),
|
|
Constant::ByteString(vec![0x01, 0x23, 0x45]).into(),
|
|
)
|
|
.into(),
|
|
),
|
|
"(con (pair bool bytestring) (True, #012345))",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn constant_pair_unit_string() {
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::ProtoPair(
|
|
Type::Unit,
|
|
Type::String,
|
|
Constant::Unit.into(),
|
|
Constant::String("hello universe\0".into()).into(),
|
|
)
|
|
.into(),
|
|
),
|
|
"(con (pair unit string) ((), \"hello universe\\x00\"))",
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn constant_deeply_nested_list() {
|
|
let t0 = Type::Integer;
|
|
let t1 = Type::List(t0.clone().into());
|
|
let t2 = Type::List(t1.clone().into());
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::ProtoList(
|
|
t2,
|
|
vec![
|
|
Constant::ProtoList(
|
|
t1.clone(),
|
|
vec![
|
|
Constant::ProtoList(
|
|
t0.clone(),
|
|
vec![Constant::Integer((-1).to_bigint().unwrap())],
|
|
),
|
|
Constant::ProtoList(t0.clone(), vec![]),
|
|
],
|
|
),
|
|
Constant::ProtoList(
|
|
t1,
|
|
vec![
|
|
Constant::ProtoList(t0.clone(), vec![]),
|
|
Constant::ProtoList(
|
|
t0,
|
|
vec![
|
|
Constant::Integer(2.to_bigint().unwrap()),
|
|
Constant::Integer(3.to_bigint().unwrap()),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
.into(),
|
|
),
|
|
"(con (list (list (list integer))) [[[-1], []], [[], [2, 3]]])",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn constant_data_constr() {
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::Data(PlutusData::Constr(Constr::<PlutusData> {
|
|
tag: 122,
|
|
any_constructor: None,
|
|
fields: MaybeIndefArray::Indef(vec![PlutusData::BigInt(
|
|
pallas_primitives::alonzo::BigInt::Int(2.into()),
|
|
)]),
|
|
}))
|
|
.into(),
|
|
),
|
|
"(con data (Constr 1 [I 2]))",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn constant_data_map() {
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::Data(PlutusData::Map(uplc::KeyValuePairs::Def(vec![
|
|
(
|
|
PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(0.into())),
|
|
PlutusData::BoundedBytes(vec![0x00].into()),
|
|
),
|
|
(
|
|
PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(1.into())),
|
|
PlutusData::BoundedBytes(vec![0x0f].into()),
|
|
),
|
|
])))
|
|
.into(),
|
|
),
|
|
"(con data (Map [(I 0, B #00), (I 1, B #0f)]))",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn constant_data_list() {
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::Data(PlutusData::Array(MaybeIndefArray::Indef(vec![
|
|
PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(0.into())),
|
|
PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(1.into())),
|
|
])))
|
|
.into(),
|
|
),
|
|
"(con data (List [I 0, I 1]))",
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn constant_data_int() {
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::Data(PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(
|
|
2.into(),
|
|
)))
|
|
.into(),
|
|
),
|
|
"(con data (I 2))",
|
|
);
|
|
|
|
let term = Term::<Name>::Constant(
|
|
Constant::Data(PlutusData::BigInt(
|
|
pallas_primitives::alonzo::BigInt::BigUInt(vec![2, 3, 4].into()),
|
|
))
|
|
.into(),
|
|
);
|
|
assert_eq!(term.to_pretty(), "(con data (I 131844))");
|
|
let term = Term::<Name>::Constant(
|
|
Constant::Data(PlutusData::BigInt(
|
|
pallas_primitives::alonzo::BigInt::BigNInt(vec![2, 3, 3].into()),
|
|
))
|
|
.into(),
|
|
);
|
|
assert_eq!(term.to_pretty(), "(con data (I -131844))");
|
|
}
|
|
|
|
#[test]
|
|
fn constant_data_bytes() {
|
|
round_trip(
|
|
Term::<Name>::Constant(
|
|
Constant::Data(PlutusData::BoundedBytes(vec![0x00, 0x1A].into())).into(),
|
|
),
|
|
"(con data (B #001a))",
|
|
);
|
|
}
|