Fix unwrap issues

This commit is contained in:
microproofs
2024-08-01 11:15:47 -04:00
committed by Kasey
parent 93a141bfa4
commit a132a2e486
4 changed files with 190 additions and 154 deletions

View File

@@ -5221,6 +5221,7 @@ fn expect_head3_cast_data_no_tail() {
false,
);
}
#[test]
fn expect_head_cast_data_no_tail() {
let src = r#"
@@ -5309,131 +5310,143 @@ fn expect_head_cast_data_with_tail() {
assert_uplc(
src,
Term::var("unwrap_a")
.choose_list(
Term::var("__val")
.choose_data(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("tail_1")
.choose_list(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::equals_integer()
.apply(Term::var("h"))
.apply(Term::var("h"))
.delayed_if_then_else(
Term::equals_integer()
.apply(Term::var("j"))
.apply(Term::var("j")),
Term::bool(false),
)
.lambda("_")
.apply(
Term::var("expect_on_list")
.lambda("expect_on_list")
.apply(
Term::var("expect_on_list")
.apply(Term::var("expect_on_list"))
.apply(Term::var("list_to_check"))
.lambda("expect_on_list")
.apply(
Term::var("list_to_check")
.delayed_choose_list(
Term::unit(),
Term::var("expect_on_list")
.apply(Term::var("expect_on_list"))
.apply(
Term::tail_list().apply(Term::var(
"list_to_check",
)),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::list_values(vec![
Constant::Data(Data::integer(1.into())),
Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())),
])
.choose_list(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("__val")
.choose_data(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("tail_1")
.choose_list(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("__val")
.choose_data(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect_on_list")
.apply(Term::tail_list().apply(Term::var("tail_2")))
.apply(
Term::var("__list")
.choose_list(
Term::equals_integer()
.apply(Term::var("h"))
.apply(Term::var("h"))
.delayed_if_then_else(
Term::equals_integer()
.apply(Term::var("j"))
.apply(Term::var("j")),
Term::bool(false),
),
Term::var("__head").choose_data(
Term::var(
"expect[h,j,..]:List<Int>=a",
),
Term::var(
"expect[h,j,..]:List<Int>=a",
),
Term::var(
"expect[h,j,..]:List<Int>=a",
),
Term::var(
"__curried_expect_on_list",
)
.apply(
Term::tail_list()
.apply(Term::var("__list")),
)
.lambda("_")
.apply(
Term::un_i_data()
.apply(Term::var("__head")),
),
Term::var(
"expect[h,j,..]:List<Int>=a",
),
)
.lambda("_")
.apply(Term::var("check_with").apply(
Term::head_list().apply(Term::var(
"list_to_check",
)),
)),
)
.lambda("list_to_check")
.lambda("expect_on_list"),
)
.lambda("check_with")
.lambda("list_to_check"),
)
.apply(Term::var("tail_2"))
.apply(
Term::var("__val")
.choose_data(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::un_i_data().apply(Term::var("__val")).delay(),
Term::var("expect[h,j,..]:List<Int>=a"),
)
.force()
.lambda("__val")
.apply(Term::var("list_item"))
.lambda("list_item"),
),
)
.lambda("tail_2")
.apply(Term::tail_list().apply(Term::var("tail_1")))
.lambda("j")
.apply(
Term::var("__val")
.choose_data(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::un_i_data().apply(Term::var("__val")).delay(),
Term::var("expect[h,j,..]:List<Int>=a"),
)
.force()
.lambda("__val")
.apply(Term::head_list().apply(Term::var("tail_1"))),
)
.delay(),
)
.force()
.lambda("tail_1")
.apply(Term::tail_list().apply(Term::var("unwrap_a")))
.lambda("h")
.apply(
Term::var("__val")
.choose_data(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::un_i_data().apply(Term::var("__val")).delay(),
Term::var("expect[h,j,..]:List<Int>=a"),
)
.force()
.lambda("__val")
.apply(Term::head_list().apply(Term::var("unwrap_a"))),
)
.delay(),
)
.force()
.lambda("unwrap_a")
.apply(
Term::var("__val")
.choose_data(
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::list_values(vec![
.lambda("__head")
.apply(Term::head_list().apply(Term::var("__list"))),
)
.lambda("__curried_expect_on_list")
.lambda("__list"),
)
.lambda("expect_on_list")
.apply(
Term::var("expect_on_list")
.apply(Term::var("expect_on_list"))
.lambda("expect_on_list")
.apply(
Term::var("check_with")
.apply(Term::var("__list"))
.apply(
Term::var("expect_on_list")
.apply(Term::var(
"expect_on_list",
)),
)
.lambda("__list")
.lambda("expect_on_list"),
)
.lambda("check_with")
.lambda("__list"),
)
.lambda("j")
.apply(
Term::un_i_data()
.apply(Term::var("__val"))
.delay(),
),
Term::var("expect[h,j,..]:List<Int>=a"),
)
.force()
.lambda("__val")
.apply(Term::head_list().apply(Term::var("tail_1")))
.lambda("tail_2")
.apply(Term::tail_list().apply(Term::var("tail_1")))
.delay(),
)
.force()
.lambda("tail_1")
.apply(Term::tail_list().apply(Term::list_values(vec![
Constant::Data(Data::integer(1.into())),
Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())),
])))
.lambda("h")
.apply(Term::un_i_data().apply(Term::var("__val")))
.delay(),
Term::var("expect[h,j,..]:List<Int>=a"),
)
.force()
.lambda("__val")
.apply(Term::head_list().apply(Term::list_values(vec![
Constant::Data(Data::integer(1.into())),
Constant::Data(Data::integer(2.into())),
Constant::Data(Data::integer(3.into())),
])
.delay(),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
)
.force()
.lambda("__val")
.apply(Term::data(Data::list(vec![
Data::integer(1.into()),
Data::integer(2.into()),
Data::integer(3.into()),
]))),
]))),
)
.force()
.delay(),
Term::var("expect[h,j,..]:List<Int>=a"),
Term::var("expect[h,j,..]:List<Int>=a"),
)
.force()
.lambda("__val")
.apply(Term::data(Data::list(vec![
Data::integer(1.into()),
Data::integer(2.into()),
Data::integer(3.into()),
])))
.lambda("expect[h,j,..]:List<Int>=a")
.apply(
Term::Error