From ff87a4c60f33ab1206ffeef05e71e6bd6f87558b Mon Sep 17 00:00:00 2001 From: microproofs Date: Sun, 23 Apr 2023 12:51:23 -0400 Subject: [PATCH] fix: "when bool is" was not properly assigning term to body when not a complex clause Add some end to end tests to test uplc --- crates/aiken-lang/src/gen_uplc.rs | 4 +- crates/aiken-project/src/tests/gen_uplc.rs | 69 ++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/crates/aiken-lang/src/gen_uplc.rs b/crates/aiken-lang/src/gen_uplc.rs index ab81d460..615f5da6 100644 --- a/crates/aiken-lang/src/gen_uplc.rs +++ b/crates/aiken-lang/src/gen_uplc.rs @@ -4402,7 +4402,7 @@ impl<'a> CodeGenerator<'a> { let other_clauses = if complex_clause { Term::var("__other_clauses_delayed") } else { - term.clone() + term.clone().delay() }; if matches!(clause, Term::Constant(boolean) if matches!(boolean.as_ref(), UplcConstant::Bool(true))) @@ -4418,6 +4418,8 @@ impl<'a> CodeGenerator<'a> { if complex_clause { term = body.lambda("__other_clauses_delayed").apply(term.delay()); + } else { + term = body; } } else { let condition = if tipo.is_int() { diff --git a/crates/aiken-project/src/tests/gen_uplc.rs b/crates/aiken-project/src/tests/gen_uplc.rs index 76414ba0..9e56b190 100644 --- a/crates/aiken-project/src/tests/gen_uplc.rs +++ b/crates/aiken-project/src/tests/gen_uplc.rs @@ -1060,3 +1060,72 @@ fn expect_empty_list_on_new_list() { false, ); } + +#[test] +fn when_bool_is_true() { + let src = r#" + test it() { + when True is { + True -> + True + False -> + error + } + } + "#; + + assert_uplc( + src, + Term::var("subject") + .delayed_if_else(Term::bool(true), Term::Error) + .lambda("subject") + .apply(Term::bool(true)), + false, + ); +} + +#[test] +fn when_bool_is_true_switched_cases() { + let src = r#" + test it() { + when True is { + False -> + error + True -> + True + } + } + "#; + + assert_uplc( + src, + Term::var("subject") + .delayed_if_else(Term::bool(true), Term::Error) + .lambda("subject") + .apply(Term::bool(true)), + false, + ); +} + +#[test] +fn when_bool_is_false() { + let src = r#" + test it() { + when False is { + False -> + error + True -> + True + } + } + "#; + + assert_uplc( + src, + Term::var("subject") + .delayed_if_else(Term::bool(true), Term::Error) + .lambda("subject") + .apply(Term::bool(false)), + true, + ); +}