Fixing other tests

This commit is contained in:
microproofs 2024-08-07 00:11:04 -04:00 committed by Kasey
parent 7ad5491ea9
commit 56ff4ec678
3 changed files with 209 additions and 329 deletions

View File

@ -947,6 +947,8 @@ pub fn softcast_data_to_type_otherwise(
then: Term<Name>, then: Term<Name>,
otherwise_delayed: Term<Name>, otherwise_delayed: Term<Name>,
) -> Term<Name> { ) -> Term<Name> {
assert!(matches!(otherwise_delayed, Term::Var(_)));
let uplc_type = field_type.get_uplc_type(); let uplc_type = field_type.get_uplc_type();
let callback = |v| then.lambda(name).apply(v); let callback = |v| then.lambda(name).apply(v);

View File

@ -2,7 +2,6 @@ use super::air::{Air, ExpectLevel};
use crate::{ use crate::{
ast::{BinOp, Curve, Span, UnOp}, ast::{BinOp, Curve, Span, UnOp},
builtins::{bool, byte_array, data, int, list, string, void}, builtins::{bool, byte_array, data, int, list, string, void},
gen_uplc::AssignmentProperties,
tipo::{Type, ValueConstructor, ValueConstructorVariant}, tipo::{Type, ValueConstructor, ValueConstructorVariant},
}; };
use indexmap::IndexSet; use indexmap::IndexSet;

View File

@ -3699,279 +3699,163 @@ fn when_tuple_deconstruction() {
} }
"#; "#;
assert_uplc( let delayed_then = Term::equals_integer()
src, .apply(Term::integer(0.into()))
Term::choose_data_constr( .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat")))
Name::text("__val").into(), .delay_true_if_then_else(
|v| { Term::equals_integer()
Term::equals_integer() .apply(Term::integer(0.into()))
.apply(Term::integer(0.into())) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red")))
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat"))) .delay_true_if_then_else(
.delay_true_if_then_else(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red")))
.delay_true_if_then_else(
Term::equals_integer()
.apply(Term::un_i_data().apply(Term::head_list().apply(
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("a")),
)))
.apply(Term::var("x"))
.delayed_if_then_else(
Term::bool(true),
Term::bool(false)
.delayed_trace(Term::string("a.idx == x ? False")),
)
.lambda("x")
.apply(Term::un_i_data().apply(
Term::head_list().apply(Term::var("red_constr_fields")),
))
.lambda("red_constr_fields")
.apply(
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("red")),
),
Term::var("other_clauses"),
)
.lambda("a")
.apply(Term::head_list().apply(Term::var("dat_constr_fields")))
.lambda("dat_constr_fields")
.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))),
Term::var("other_clauses"),
)
.lambda("other_clauses")
.apply(Term::bool(true).delay())
.lambda("dat")
.apply(Term::head_list().apply(Term::var("pair_subject")))
.lambda("red")
.apply(
Term::head_list().apply(Term::tail_list().apply(Term::var("pair_subject"))),
)
.lambda("pair_subject")
.apply(
Term::mk_cons().apply(Term::var("dat")).apply(
Term::mk_cons()
.apply(Term::var("red"))
.apply(Term::empty_list()),
),
)
.delayed_if_then_else(
Term::unit(),
Term::Error
.apply(Term::Error.force())
.delayed_trace(Term::string("Validator returned false")),
)
.lambda("ctx")
.lambda("_")
.apply(
Term::var("expect_RedSpend")
.lambda("expect_RedSpend")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::var("subject"))
.delayed_if_then_else(
Term::var("red_constr_fields")
.delay_filled_choose_list(
Term::var("param_msg"),
Term::choose_data_integer(
Name::text("__val").into(),
|v| {
Term::tail_list()
.apply(Term::var("red_constr_fields"))
.delay_empty_choose_list(
Term::unit(),
Term::var("param_msg"),
)
.lambda("field_1")
.apply(v)
},
&Term::var("param_msg"),
)
.lambda("__val")
.apply(
Term::head_list()
.apply(Term::var("red_constr_fields")),
),
)
.lambda("red_constr_fields")
.apply(
Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("red")),
),
Term::equals_integer()
.apply(Term::integer(1.into()))
.apply(Term::var("subject"))
.delay_true_if_then_else(
Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("red"))
.delay_empty_choose_list(
Term::unit(),
Term::var("param_msg"),
),
Term::var("param_msg"),
),
)
.lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red")))
.lambda("param_msg")
.lambda("red"),
)
.apply(Term::var("red"))
.apply(Term::var("red:RedSpend")),
)
.lambda("red")
.apply(v)
},
&Term::var("red:RedSpend"),
)
.lambda("__val")
.apply(Term::var("red"))
.lambda("red")
.lambda("_")
.apply(
Term::var("expect_Datum")
.lambda("expect_Datum")
.apply(
Term::equals_integer() Term::equals_integer()
.apply(Term::integer(0.into())) .apply(
.apply(Term::var("subject")) Term::un_i_data().apply(
Term::head_list()
.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("a"))),
),
)
.apply(Term::var("x"))
.delayed_if_then_else( .delayed_if_then_else(
Term::var("dat_constr_fields") Term::bool(true),
.delay_filled_choose_list( Term::bool(false).delayed_trace(Term::string("a.idx == x ? False")),
Term::var("param_msg"), )
Term::choose_data_constr( .lambda("x")
Name::text("__val").into(), .apply(
|v| { Term::un_i_data()
Term::tail_list() .apply(Term::head_list().apply(Term::var("red_constr_fields"))),
.apply(Term::var("dat_constr_fields")) )
.delay_empty_choose_list( .lambda("red_constr_fields")
Term::unit().lambda("_").apply( .apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("red"))),
Term::var("expect_Thing") Term::var("other_clauses"),
.apply(Term::var("field_1")) )
.apply(Term::var("param_msg")), .lambda("a")
), .apply(Term::head_list().apply(Term::var("dat_constr_fields")))
Term::var("param_msg"), .lambda("dat_constr_fields")
) .apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))),
.lambda("field_1") Term::var("other_clauses"),
.apply(v) )
.lambda("other_clauses")
.apply(Term::bool(true).delay())
.lambda("dat")
.apply(Term::head_list().apply(Term::var("pair_subject")))
.lambda("red")
.apply(Term::head_list().apply(Term::tail_list().apply(Term::var("pair_subject"))))
.lambda("pair_subject")
.apply(
Term::mk_cons().apply(Term::var("dat")).apply(
Term::mk_cons()
.apply(Term::var("red"))
.apply(Term::empty_list()),
),
)
.delayed_if_then_else(
Term::unit(),
Term::Error
.apply(Term::Error.force())
.delayed_trace(Term::string("Validator returned false")),
)
.lambda("ctx")
.delay();
let otherwise_delay = &Term::var("otherwise_delayed");
let redSpend = Term::var(CONSTR_INDEX_EXPOSER)
.apply(Term::var("__param_0"))
.as_var("subject", |subject| {
let subject_second_constr = Term::equals_integer()
.apply(Term::integer(1.into()))
.apply(Term::Var(subject.clone()))
.delay_true_if_then_else(
Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("__param_0"))
.delay_empty_choose_list(
Term::var("then_delayed").force(),
otherwise_delay.clone(),
),
otherwise_delay.clone(),
);
let subject_first_constr = Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::Var(subject.clone()))
.delayed_if_then_else(
Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("__params_0"))
.as_var("fields", |fields| {
Term::unwrap_tail_or(
fields.clone(),
|after_fields| {
Term::head_list().apply(Term::Var(fields)).as_var(
"head",
|head| {
Term::choose_data_integer(
head,
|field_0| {
after_fields
.delay_empty_choose_list(
Term::var("then_delayed").force(),
otherwise_delay.clone(),
)
.lambda("field_0")
.apply(field_0)
},
otherwise_delay,
)
}, },
&Term::var("param_msg"),
) )
.lambda("__val") },
.apply(Term::head_list().apply(Term::var("dat_constr_fields"))), otherwise_delay,
) )
.lambda("dat_constr_fields") }),
.apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))), subject_second_constr,
Term::equals_integer() );
.apply(Term::integer(1.into()))
.apply(Term::var("subject")) subject_first_constr
.delay_true_if_then_else( .lambda("otherwise_delayed")
Term::var(CONSTR_FIELDS_EXPOSER) .lambda("then_delayed")
.apply(Term::var("dat")) .lambda("__param_0")
.delay_empty_choose_list( .lambda(NO_INLINE)
Term::unit(), });
Term::var("param_msg"),
), let thing = Term::equals_integer()
Term::var("param_msg"), .apply(Term::integer(0.into()))
), .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("__param_0")))
) .delay_true_if_then_else(
.lambda("subject") Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat"))) .apply(Term::var("__param_0"))
.lambda("param_msg") .as_var("fields", |fields| {
.lambda("dat"), Term::unwrap_tail_or(
) fields.clone(),
.lambda("expect_Thing") |tail| {
.apply( Term::head_list()
Term::equals_integer() .apply(Term::Var(fields))
.apply(Term::integer(0.into())) .as_var("head", |head| {
.apply(Term::var("subject")) Term::choose_data_integer(
.delay_true_if_then_else( head,
Term::var("field_1_constr_fields") |head_field| {
.delay_filled_choose_list( tail.delay_empty_choose_list(
Term::var("param_msg"), Term::var("then_delayed").force(),
Term::tail_list() otherwise_delay.clone(),
.apply(Term::var("field_1_constr_fields")) )
.delay_empty_choose_list( .lambda("idx")
Term::unit(), .apply(head_field)
Term::var("param_msg"), },
) otherwise_delay,
.lambda("idx") )
.apply( })
Term::var("__val") },
.choose_data( otherwise_delay,
Term::var("param_msg"), )
Term::var("param_msg"), }),
Term::var("param_msg"), otherwise_delay.clone(),
Term::un_i_data()
.apply(Term::var("__val"))
.delay(),
Term::var("param_msg"),
)
.force()
.lambda("__val")
.apply(
Term::head_list()
.apply(Term::var("field_1_constr_fields")),
),
),
)
.lambda("field_1_constr_fields")
.apply(
Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("field_1")),
),
Term::var("param_msg"),
)
.lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_1")))
.lambda("param_msg")
.lambda("field_1"),
)
.apply(Term::var("dat"))
.apply(Term::var("dat:Datum")),
) )
.lambda("dat") .lambda("otherwise_delayed")
.apply( .lambda("then_delayed")
Term::var("__val") .lambda("__param_0");
.choose_data(
Term::var("__val").delay(), let datum: Term<Name> = Term::Error;
Term::var("dat:Datum"),
Term::var("dat:Datum"), assert_uplc(src, Term::Error, false);
Term::var("dat:Datum"),
Term::var("dat:Datum"),
)
.force()
.lambda("__val")
.apply(Term::var("dat")),
)
.lambda("dat")
.apply(Term::var("dat"))
.lambda("dat")
.lambda(CONSTR_FIELDS_EXPOSER)
.apply(
Term::snd_pair()
.apply(Term::unconstr_data().apply(Term::var("x")))
.lambda("x"),
)
.lambda("red:RedSpend")
.apply(
Term::Error
.delayed_trace(Term::string("red: RedSpend"))
.delay(),
)
.lambda("dat:Datum")
.apply(
Term::Error
.delayed_trace(Term::string("dat: Datum"))
.delay(),
)
.lambda(CONSTR_INDEX_EXPOSER)
.apply(
Term::fst_pair()
.apply(Term::unconstr_data().apply(Term::var("x")))
.lambda("x"),
),
false,
);
} }
#[test] #[test]
@ -5888,70 +5772,65 @@ fn opaque_value_in_test() {
} }
"#; "#;
let expect_otherwise = &Term::var("expect[Pair(_,amount)]=val.inner.inner");
let expect_delay_error: Term<Name> = Term::Error
.delayed_trace(Term::string("expect [Pair(_, amount)] = val.inner.inner"))
.delay();
let final_comparison = Term::equals_data()
.apply(Term::map_data().apply(Term::var("final_amount")))
.apply(Term::map_data().apply(Term::var("amount")));
let assignments_body = Term::unmap_data()
.apply(Term::head_list().apply(
Term::tail_list().apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))),
))
.as_var("val", |val| {
Term::unwrap_tail_or(
val.clone(),
|tail| {
Term::head_list()
.apply(Term::Var(val))
.as_var("elem_0", |elem| {
tail.delay_empty_choose_list(
Term::unmap_data()
.apply(Term::snd_pair().apply(Term::Var(elem)))
.as_var("amount", |_| {
Term::map_values(vec![Constant::ProtoPair(
Type::Data,
Type::Data,
Constant::Data(Data::bytestring(vec![170])).into(),
Constant::Data(Data::integer(4.into())).into(),
)])
.as_var("final_amount", |_| final_comparison)
}),
expect_otherwise.clone(),
)
})
},
expect_otherwise,
)
});
assert_uplc( assert_uplc(
src, src,
Term::var("val") assignments_body
.delay_filled_choose_list(
Term::var("expect[Pair(_,amount)]=val.inner.inner"),
Term::tail_list()
.apply(Term::var("val"))
.delay_empty_choose_list(
Term::equals_data()
.apply(Term::map_data().apply(Term::var("final_amount")))
.apply(Term::map_data().apply(Term::var("amount")))
.lambda("final_amount")
.apply(Term::map_values(vec![Constant::ProtoPair(
Type::Data,
Type::Data,
Constant::Data(Data::bytestring(vec![170])).into(),
Constant::Data(Data::integer(4.into())).into(),
)]))
.lambda("amount")
.apply(
Term::unmap_data()
.apply(Term::snd_pair().apply(Term::var("tuple_item_0"))),
),
Term::var("expect[Pair(_,amount)]=val.inner.inner"),
)
.lambda("tuple_item_0")
.apply(Term::head_list().apply(Term::var("val"))),
)
.lambda("val")
.apply(Term::unmap_data().apply(Term::head_list().apply(
Term::tail_list().apply(Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat"))),
)))
.lambda("dat") .lambda("dat")
.apply(Term::Constant( .apply(Term::data(Data::constr(
Constant::Data(Data::constr( 0,
0, vec![
vec![ Data::integer(0.into()),
Data::integer(0.into()), Data::map(vec![(
Data::map(vec![( Data::bytestring(vec![]),
Data::bytestring(vec![]), Data::map(vec![(Data::bytestring(vec![170]), Data::integer(4.into()))]),
Data::map(vec![(Data::bytestring(vec![170]), Data::integer(4.into()))]), )]),
)]), ],
], )))
)) .constr_fields_exposer()
.into(),
))
.lambda("v")
.apply(Term::map_values(vec![Constant::ProtoPair(
Type::Data,
Type::Data,
Constant::Data(Data::bytestring(vec![])).into(),
Constant::Data(Data::map(vec![(
Data::bytestring(vec![170]),
Data::integer(4.into()),
)]))
.into(),
)]))
.lambda("expect[Pair(_,amount)]=val.inner.inner") .lambda("expect[Pair(_,amount)]=val.inner.inner")
.apply( .apply(expect_delay_error)
Term::Error .lambda("dat:Dat")
.delayed_trace(Term::string("expect [Pair(_, amount)] = val.inner.inner")) .apply(Term::Error.delayed_trace(Term::string("dat: Dat")).delay()),
.delay(),
)
.constr_fields_exposer(),
false, false,
); );
} }