fix and clean up tests and handle

one edge case on rearrange clauses
This commit is contained in:
microproofs 2023-07-28 13:52:32 -04:00 committed by Kasey
parent 018453f6b1
commit 4e3ced5b75
2 changed files with 241 additions and 237 deletions

View File

@ -784,10 +784,11 @@ pub fn rearrange_list_clauses(clauses: Vec<TypedClause>) -> Vec<TypedClause> {
is_wild_card_elems_clause && !pattern_has_conditions(element); is_wild_card_elems_clause && !pattern_has_conditions(element);
} }
if is_wild_card_elems_clause if is_wild_card_elems_clause {
&& wild_card_clause_elems < elements.len() + usize::from(tail.is_none()) if wild_card_clause_elems < elements.len() + usize::from(tail.is_none()) {
{ wild_card_clause_elems += 1;
wild_card_clause_elems += 1; }
if clause.guard.is_none() && tail.is_some() && !elements.is_empty() { if clause.guard.is_none() && tail.is_some() && !elements.is_empty() {
last_clause_index = index; last_clause_index = index;
last_clause_set = true; last_clause_set = true;
@ -820,7 +821,9 @@ pub fn rearrange_list_clauses(clauses: Vec<TypedClause>) -> Vec<TypedClause> {
// Encountered a tail so stop there with that as last clause // Encountered a tail so stop there with that as last clause
if last_clause_set { if last_clause_set {
final_clauses = final_clauses[0..last_clause_index].to_vec(); for _ in 0..(sorted_clauses.len() - 1 - last_clause_index) {
final_clauses.pop();
}
} }
// insert hole fillers into clauses // insert hole fillers into clauses

View File

@ -73,7 +73,6 @@ fn assert_uplc(source_code: &str, expected: Term<Name>, should_fail: bool) {
}; };
let expected = optimize::aiken_optimize_and_intern(expected); let expected = optimize::aiken_optimize_and_intern(expected);
// println!("expected: {}", expected.to_pretty());
let expected: Program<DeBruijn> = expected.try_into().unwrap(); let expected: Program<DeBruijn> = expected.try_into().unwrap();
@ -2858,8 +2857,7 @@ fn when_tuple_deconstruction() {
Term::un_i_data().apply( Term::un_i_data().apply(
Term::var(CONSTR_GET_FIELD) Term::var(CONSTR_GET_FIELD)
.apply( .apply(
Term::var(CONSTR_FIELDS_EXPOSER) Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("a")),
.apply(Term::var("a")),
) )
.apply(Term::integer(0.into())), .apply(Term::integer(0.into())),
), ),
@ -2897,135 +2895,137 @@ fn when_tuple_deconstruction() {
.apply(Term::var("red")), .apply(Term::var("red")),
) )
.delayed_if_else(Term::unit(), Term::Error) .delayed_if_else(Term::unit(), Term::Error)
.lambda("red") .lambda("_")
.apply( .apply(
Term::var("red").lambda("_").apply( Term::var("expect_RedSpend")
Term::var("expect_RedSpend") .lambda("expect_RedSpend")
.lambda("expect_RedSpend") .apply(
.apply( Term::equals_integer()
Term::equals_integer() .apply(Term::integer(0.into()))
.apply(Term::integer(0.into())) .apply(Term::var("subject"))
.apply(Term::var("subject")) .delayed_if_else(
.delayed_if_else( Term::tail_list()
Term::tail_list() .apply(Term::var("red_constr_fields"))
.apply(Term::var("red_constr_fields")) .delayed_choose_list(
.delayed_choose_list( Term::unit(),
Term::unit(), Term::Error.trace(Term::string(
Term::Error.trace(Term::string("List/Tuple/Constr contains more items than expected")), "List/Tuple/Constr contains more items than expected",
) )),
.lambda("field_1") )
.apply(Term::un_i_data().apply( .lambda("field_1")
Term::head_list().apply(Term::var("red_constr_fields")), .apply(Term::un_i_data().apply(
)) Term::head_list().apply(Term::var("red_constr_fields")),
.lambda("red_constr_fields") ))
.apply( .lambda("red_constr_fields")
Term::var(CONSTR_FIELDS_EXPOSER) .apply(
.apply(Term::var("red")), Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("red")),
),
Term::equals_integer()
.apply(Term::integer(1.into()))
.apply(Term::var("subject"))
.delayed_if_else(
Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("red"))
.delayed_choose_list(
Term::unit(),
Term::Error.trace(Term::string(
"Expected no fields for Constr",
)),
),
Term::Error.trace(Term::string(
"Constr index did not match any type variant",
)),
),
)
.lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red")))
.lambda("red"),
)
.apply(Term::var("red")),
)
.lambda("red")
.apply(Term::var("red"))
.lambda("_")
.apply(
Term::var("expect_Datum")
.lambda("expect_Datum")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::var("subject"))
.delayed_if_else(
Term::tail_list()
.apply(Term::var("dat_constr_fields"))
.delayed_choose_list(
Term::unit().lambda("_").apply(
Term::var("expect_Thing").apply(Term::var("field_1")),
), ),
Term::equals_integer() Term::Error.trace(Term::string(
.apply(Term::integer(1.into())) "List/Tuple/Constr contains more items than expected",
.apply(Term::var("subject")) )),
.delayed_if_else( )
Term::var(CONSTR_FIELDS_EXPOSER) .lambda("field_1")
.apply(Term::var("red")) .apply(Term::head_list().apply(Term::var("dat_constr_fields")))
.delayed_choose_list( .lambda("dat_constr_fields")
Term::unit(), .apply(
Term::Error Term::var(CONSTR_FIELDS_EXPOSER).apply(Term::var("dat")),
.trace(Term::string("Expected no fields for Constr")) ),
), Term::equals_integer()
Term::Error.trace(Term::string("Constr index did not match any type variant")), .apply(Term::integer(1.into()))
), .apply(Term::var("subject"))
) .delayed_if_else(
.lambda("subject") Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("red"))) .apply(Term::var("dat"))
.lambda("red"), .delayed_choose_list(
) Term::unit(),
.apply(Term::var("red")), Term::Error.trace(Term::string(
), "Expected no fields for Constr",
)),
),
Term::Error.trace(Term::string(
"Constr index did not match any type variant",
)),
),
)
.lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat")))
.lambda("dat"),
)
.lambda("expect_Thing")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::var("subject"))
.delayed_if_else(
Term::tail_list()
.apply(Term::var("field_1_constr_fields"))
.delayed_choose_list(
Term::unit(),
Term::Error.trace(Term::string(
"List/Tuple/Constr contains more items than expected",
)),
)
.lambda("idx")
.apply(Term::un_i_data().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::Error.trace(Term::string(
"Constr index did not match any type variant",
)),
)
.lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_1")))
.lambda("field_1"),
)
.apply(Term::var("dat")),
) )
.lambda("dat") .lambda("dat")
.apply( .apply(Term::var("dat"))
Term::var("dat").lambda("_").apply(
Term::var("expect_Datum")
.lambda("expect_Datum")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::var("subject"))
.delayed_if_else(
Term::tail_list()
.apply(Term::var("dat_constr_fields"))
.delayed_choose_list(
Term::unit().lambda("_").apply(
Term::var("expect_Thing")
.apply(Term::var("field_1")),
),
Term::Error.trace(Term::string("List/Tuple/Constr contains more items than expected")),
)
.lambda("field_1")
.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::equals_integer()
.apply(Term::integer(1.into()))
.apply(Term::var("subject"))
.delayed_if_else(
Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("dat"))
.delayed_choose_list(
Term::unit(),
Term::Error
.trace(Term::string("Expected no fields for Constr"))
),
Term::Error.trace(Term::string("Constr index did not match any type variant")),
),
)
.lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("dat")))
.lambda("dat"),
)
.lambda("expect_Thing")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::var("subject"))
.delayed_if_else(
Term::tail_list()
.apply(Term::var("field_1_constr_fields"))
.delayed_choose_list(
Term::unit(),
Term::Error.trace(Term::string("List/Tuple/Constr contains more items than expected")),
)
.lambda("idx")
.apply(
Term::un_i_data().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::Error.trace(Term::string(
"Constr index did not match any type variant",
)),
)
.lambda("subject")
.apply(
Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_1")),
)
.lambda("field_1"),
)
.apply(Term::var("dat")),
),
)
.lambda("ctx") .lambda("ctx")
.lambda("red") .lambda("red")
.lambda("dat") .lambda("dat")
@ -3211,114 +3211,115 @@ fn generic_validator_type_test() {
.lambda("subject") .lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("r"))) .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("r")))
.delayed_if_else(Term::unit(), Term::Error) .delayed_if_else(Term::unit(), Term::Error)
.lambda("r") .lambda("_").apply(
.apply( Term::var("__expect_A")
Term::var("r").lambda("_").apply( .lambda("__expect_A")
Term::var("__expect_A") .apply(
.lambda("__expect_A") Term::equals_integer()
.apply( .apply(Term::integer(0.into()))
Term::equals_integer() .apply(Term::var("subject"))
.apply(Term::integer(0.into())) .delayed_if_else(
.apply(Term::var("subject")) Term::var(CONSTR_FIELDS_EXPOSER)
.delayed_if_else( .apply(Term::var("r"))
Term::var(CONSTR_FIELDS_EXPOSER) .delayed_choose_list(
.apply(Term::var("r")) Term::unit(),
.delayed_choose_list( Term::Error.trace(Term::string(
Term::unit(), "Expected no fields for Constr",
Term::Error.trace(Term::string( )),
"Expected no fields for Constr", ),
)), Term::equals_integer()
), .apply(Term::integer(1.into()))
Term::equals_integer() .apply(Term::var("subject"))
.apply(Term::integer(1.into())) .delayed_if_else(
.apply(Term::var("subject")) Term::tail_list()
.delayed_if_else( .apply(Term::var("tail_1"))
Term::tail_list() .delayed_choose_list(
.apply(Term::var("tail_1")) Term::unit().lambda("_").apply(
.delayed_choose_list( Term::var("__expect_B")
Term::unit().lambda("_").apply( .apply(Term::var("field_B")),
Term::var("__expect_B") ),
.apply(Term::var("field_B")), Term::Error
), .trace(Term::string("List/Tuple/Constr contains more items than expected")),
Term::Error )
.trace(Term::string("List/Tuple/Constr contains more items than expected")), .lambda("field_B")
) .apply(Term::head_list().apply(Term::var("tail_1")))
.lambda("field_B") .lambda("tail_1")
.apply(Term::head_list().apply(Term::var("tail_1"))) .apply(
.lambda("tail_1") Term::tail_list().apply(Term::var("r_fields")),
.apply( )
Term::tail_list().apply(Term::var("r_fields")), .lambda("field_0")
) .apply(
.lambda("field_0") Term::equals_integer()
.apply( .apply(Term::integer(0.into()))
Term::equals_integer() .apply(
.apply(Term::integer(0.into())) Term::fst_pair().apply(
.apply( Term::unconstr_data().apply(
Term::fst_pair().apply( Term::head_list().apply(
Term::unconstr_data().apply( Term::var("r_fields"),
Term::head_list().apply(
Term::var("r_fields"),
),
), ),
), ),
)
.delayed_if_else(Term::unit(), Term::Error),
)
.lambda("r_fields")
.apply(
Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("r")),
),
Term::Error.trace(Term::string(
"Constr index did not match any type variant",
)),
),
)
.lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("r")))
.lambda("r"),
)
.lambda("__expect_B")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::var("subject"))
.delayed_if_else(
Term::tail_list()
.apply(Term::var("B_fields"))
.delayed_choose_list(
Term::unit(),
Term::Error.trace(Term::string(error_string)),
)
.lambda("something")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(
Term::fst_pair().apply(
Term::unconstr_data().apply(
Term::head_list()
.apply(Term::var("B_fields")),
), ),
)
.delayed_if_else(Term::unit(), Term::Error),
)
.lambda("r_fields")
.apply(
Term::var(CONSTR_FIELDS_EXPOSER)
.apply(Term::var("r")),
),
Term::Error.trace(Term::string(
"Constr index did not match any type variant",
)),
),
)
.lambda("subject")
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("r")))
.lambda("r"),
)
.lambda("__expect_B")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(Term::var("subject"))
.delayed_if_else(
Term::tail_list()
.apply(Term::var("B_fields"))
.delayed_choose_list(
Term::unit(),
Term::Error.trace(Term::string(error_string)),
)
.lambda("something")
.apply(
Term::equals_integer()
.apply(Term::integer(0.into()))
.apply(
Term::fst_pair().apply(
Term::unconstr_data().apply(
Term::head_list()
.apply(Term::var("B_fields")),
), ),
) ),
.delayed_if_else(Term::unit(), Term::Error), )
) .delayed_if_else(Term::unit(), Term::Error),
.lambda("B_fields") )
.apply( .lambda("B_fields")
Term::var(CONSTR_FIELDS_EXPOSER) .apply(
.apply(Term::var("field_B")), Term::var(CONSTR_FIELDS_EXPOSER)
), .apply(Term::var("field_B")),
Term::Error.trace(Term::string( ),
"Constr index did not match any type variant", Term::Error.trace(Term::string(
)), "Constr index did not match any type variant",
) )),
.lambda("subject") )
.apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_B"))) .lambda("subject")
.lambda("field_B"), .apply(Term::var(CONSTR_INDEX_EXPOSER).apply(Term::var("field_B")))
) .lambda("field_B"),
.apply(Term::var("r")), )
), .apply(Term::var("r")),
)
.lambda("r")
.apply(
Term::var("r"),
) )
.lambda("_ctx") .lambda("_ctx")
.lambda("r") .lambda("r")