chore: convert acceptance test 5

Also constructors with no fields are now converted to a constant data term.
This commit is contained in:
microproofs 2023-04-18 14:31:36 -04:00 committed by Kasey
parent 9de713803a
commit 23a7e7e680
4 changed files with 91 additions and 48 deletions

View File

@ -3786,10 +3786,25 @@ impl<'a> CodeGenerator<'a> {
let fields = Term::empty_list();
let term = Term::constr_data()
let mut term = Term::constr_data()
.apply(Term::integer(constr_index.try_into().unwrap()))
.apply(fields);
let mut program: Program<Name> = Program {
version: (1, 0, 0),
term,
};
let mut interner = Interner::new();
interner.program(&mut program);
let eval_program: Program<NamedDeBruijn> = program.try_into().unwrap();
let evaluated_term: Term<NamedDeBruijn> =
eval_program.eval(ExBudget::default()).result().unwrap();
term = evaluated_term.try_into().unwrap();
arg_stack.push(term);
}
}

View File

@ -193,7 +193,7 @@ mod test {
use uplc::{
ast::{self as uplc_ast, Constant, Name},
machine::cost_model::ExBudget,
optimize, BigInt, PlutusData,
optimize, BigInt, Constr, PlutusData,
};
use super::{
@ -368,11 +368,8 @@ mod test {
term: expected,
};
println!("EXP BEFORE {}", expected.to_pretty());
let expected = optimize::aiken_optimize_and_intern(expected);
println!("EXP AFTER {}", expected.to_pretty());
let expected: Program<DeBruijn> = expected.try_into().unwrap();
assert_eq!(debruijn_program.to_pretty(), expected.to_pretty());
@ -804,6 +801,65 @@ mod test {
);
}
#[test]
fn acceptance_test_5_head_not_empty() {
let src = r#"
use aiken/builtin.{head_list}
pub fn head(xs: List<a>) -> Option<a> {
when xs is {
[] -> None
_ -> Some(head_list(xs))
}
}
test head_1() {
head([1, 2, 3]) == Some(1)
}
"#;
assert_uplc(
src,
Term::equals_data()
.apply(
Term::var("head")
.lambda("head")
.apply(
Term::var("xs")
.delayed_choose_list(
Term::Constant(
Constant::Data(PlutusData::Constr(Constr {
tag: 122,
any_constructor: None,
fields: vec![],
}))
.into(),
),
Term::constr_data().apply(Term::integer(0.into())).apply(
Term::mk_cons()
.apply(Term::head_list().apply(Term::var("xs")))
.apply(Term::empty_list()),
),
)
.lambda("xs"),
)
.apply(Term::list_values(vec![
Constant::Data(PlutusData::BigInt(BigInt::Int(1.into()))),
Constant::Data(PlutusData::BigInt(BigInt::Int(2.into()))),
Constant::Data(PlutusData::BigInt(BigInt::Int(3.into()))),
])),
)
.apply(Term::Constant(
Constant::Data(PlutusData::Constr(Constr {
tag: 121,
any_constructor: None,
fields: vec![PlutusData::BigInt(BigInt::Int(1.into()))],
}))
.into(),
)),
);
}
#[test]
fn mint_parameterized() {
assert_validator(

View File

@ -236,46 +236,20 @@ fn wrap_data_reduce(term: &mut Term<Name>) {
return;
};
wrap_data_reduce(Rc::make_mut(inner_arg));
match (first_action, second_action) {
(DefaultFunction::UnIData, DefaultFunction::IData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::IData, DefaultFunction::UnIData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::BData, DefaultFunction::UnBData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::UnBData, DefaultFunction::BData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::ListData, DefaultFunction::UnListData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::UnListData, DefaultFunction::ListData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::MapData, DefaultFunction::UnMapData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::UnMapData, DefaultFunction::MapData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::UnConstrData, DefaultFunction::ConstrData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
}
(DefaultFunction::ConstrData, DefaultFunction::UnConstrData) => {
*term = argument.as_ref().clone();
wrap_data_reduce(term);
(DefaultFunction::UnIData, DefaultFunction::IData)
| (DefaultFunction::IData, DefaultFunction::UnIData)
| (DefaultFunction::BData, DefaultFunction::UnBData)
| (DefaultFunction::UnBData, DefaultFunction::BData)
| (DefaultFunction::ListData, DefaultFunction::UnListData)
| (DefaultFunction::UnListData, DefaultFunction::ListData)
| (DefaultFunction::MapData, DefaultFunction::UnMapData)
| (DefaultFunction::UnMapData, DefaultFunction::MapData)
| (DefaultFunction::UnConstrData, DefaultFunction::ConstrData)
| (DefaultFunction::ConstrData, DefaultFunction::UnConstrData) => {
*term = inner_arg.as_ref().clone();
}
_ => {}
}

View File

@ -2,10 +2,8 @@ use aiken/builtin.{head_list}
pub fn head(xs: List<a>) -> Option<a> {
when xs is {
[] ->
None
_ ->
Some(head_list(xs))
[] -> None
_ -> Some(head_list(xs))
}
}