Support mk_cons builtin

While this builtin is readily available through the Aiken syntax
  `[head, ..tail]`, there's no reason to not support its builtin form
  even though we may not encourage its usage. For completeness and to
  avoid bad surprises, it is now supported.

  Fixes #964.
This commit is contained in:
KtorZ
2024-07-27 11:30:00 +02:00
committed by Kasey
parent bf5a406ffb
commit 1c58da4d86
3 changed files with 122 additions and 56 deletions

View File

@@ -6471,3 +6471,94 @@ fn qualified_prelude_functions() {
false,
)
}
#[test]
fn mk_cons_direct_invoke_1() {
let src = r#"
use aiken/builtin
test mk_cons_1() {
builtin.cons_list(1, []) == [1]
}
"#;
assert_uplc(
src,
Term::equals_data()
.apply(
Term::list_data().apply(
Term::mk_cons()
.apply(Term::data(Data::integer(1.into())))
.apply(Term::empty_list()),
),
)
.apply(Term::data(Data::list(vec![Data::integer(1.into())]))),
false,
)
}
#[test]
fn mk_cons_direct_invoke_2() {
let src = r#"
use aiken/builtin.{cons_list}
test mk_cons_2() {
cons_list(Some(42), [None]) == [Some(42), None]
}
"#;
let none = Data::constr(1, Vec::new());
let some = Data::constr(0, vec![Data::integer(42.into())]);
assert_uplc(
src,
Term::equals_data()
.apply(
Term::list_data().apply(Term::mk_cons().apply(Term::data(some.clone())).apply(
Term::Constant(
Constant::ProtoList(Type::Data, vec![Constant::Data(none.clone())]).into(),
),
)),
)
.apply(Term::data(Data::list(vec![some, none]))),
false,
)
}
#[test]
fn mk_cons_direct_invoke_3() {
let src = r#"
use aiken/builtin.{cons_list, i_data, mk_nil_pair_data}
test mk_cons_3() {
cons_list(Pair(i_data(1), i_data(1)), mk_nil_pair_data()) == [
Pair(i_data(1), i_data(1)),
]
}
"#;
assert_uplc(
src,
Term::equals_data()
.apply(
Term::map_data().apply(
Term::mk_cons()
.apply(Term::Constant(
Constant::ProtoPair(
Type::Data,
Type::Data,
Constant::Data(Data::integer(1.into())).into(),
Constant::Data(Data::integer(1.into())).into(),
)
.into(),
))
.apply(Term::mk_nil_pair_data().apply(Term::unit())),
),
)
.apply(Term::data(Data::map(vec![(
Data::integer(1.into()),
Data::integer(1.into()),
)]))),
false,
)
}