test(aiken-lang): add a new test for list edge case in when clause patterns
This commit is contained in:
@@ -4287,7 +4287,7 @@ fn expect_head_cast_data_with_tail() {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn init_3() {
|
||||
fn test_init_3() {
|
||||
let src = r#"
|
||||
|
||||
pub fn init(self: List<a>) -> Option<List<a>> {
|
||||
@@ -4384,3 +4384,142 @@ fn init_3() {
|
||||
false,
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn list_clause_with_guard() {
|
||||
let src = r#"
|
||||
fn do_init(self: List<Int>) -> List<Int> {
|
||||
when self is {
|
||||
[] -> fail @"unreachable"
|
||||
[_] ->
|
||||
[]
|
||||
[a, x] if x > 2 -> {
|
||||
[a]
|
||||
}
|
||||
[a, b] -> []
|
||||
[a, b, ..c] -> {
|
||||
c
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test init_3() {
|
||||
do_init([1, 3]) == [1]
|
||||
}
|
||||
"#;
|
||||
|
||||
assert_uplc(
|
||||
src,
|
||||
Term::equals_data()
|
||||
.apply(
|
||||
Term::list_data().apply(
|
||||
Term::var("do_init")
|
||||
.lambda("do_init")
|
||||
.apply(
|
||||
Term::var("self")
|
||||
.delayed_choose_list(
|
||||
Term::Error.trace(Term::string("unreachable")),
|
||||
Term::var("tail_1")
|
||||
.delayed_choose_list(
|
||||
Term::empty_list(),
|
||||
Term::var("tail_2")
|
||||
.choose_list(
|
||||
Term::var("clause_guard")
|
||||
.if_else(
|
||||
Term::mk_cons()
|
||||
.apply(
|
||||
Term::i_data()
|
||||
.apply(Term::var("a")),
|
||||
)
|
||||
.apply(Term::empty_list())
|
||||
.delay(),
|
||||
Term::var("clauses_delayed"),
|
||||
)
|
||||
.force()
|
||||
.lambda("clause_guard")
|
||||
.apply(
|
||||
Term::less_than_integer()
|
||||
.apply(Term::integer(2.into()))
|
||||
.apply(Term::var("x")),
|
||||
)
|
||||
.lambda("x")
|
||||
.apply(
|
||||
Term::un_i_data().apply(
|
||||
Term::head_list()
|
||||
.apply(Term::var("tail_1")),
|
||||
),
|
||||
)
|
||||
.lambda("a")
|
||||
.apply(
|
||||
Term::un_i_data().apply(
|
||||
Term::head_list()
|
||||
.apply(Term::var("self")),
|
||||
),
|
||||
)
|
||||
.delay(),
|
||||
Term::var("clauses_delayed"),
|
||||
)
|
||||
.force()
|
||||
.lambda("clauses_delayed")
|
||||
.apply(
|
||||
Term::var("tail_2")
|
||||
.delayed_choose_list(
|
||||
Term::empty_list()
|
||||
.lambda("b")
|
||||
.apply(
|
||||
Term::un_i_data().apply(
|
||||
Term::head_list().apply(
|
||||
Term::var("tail_1"),
|
||||
),
|
||||
),
|
||||
)
|
||||
.lambda("a")
|
||||
.apply(
|
||||
Term::un_i_data().apply(
|
||||
Term::head_list().apply(
|
||||
Term::var("self"),
|
||||
),
|
||||
),
|
||||
),
|
||||
Term::var("c").lambda("c").apply(
|
||||
Term::tail_list()
|
||||
.apply(Term::var("tail_1"))
|
||||
.lambda("b")
|
||||
.apply(Term::un_i_data().apply(
|
||||
Term::head_list().apply(
|
||||
Term::var("tail_1"),
|
||||
),
|
||||
))
|
||||
.lambda("a")
|
||||
.apply(
|
||||
Term::un_i_data().apply(
|
||||
Term::head_list()
|
||||
.apply(Term::var(
|
||||
"self",
|
||||
)),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
.delay(),
|
||||
)
|
||||
.lambda("tail_2")
|
||||
.apply(
|
||||
Term::tail_list().apply(Term::var("tail_1")),
|
||||
),
|
||||
)
|
||||
.lambda("tail_1")
|
||||
.apply(Term::tail_list().apply(Term::var("self"))),
|
||||
)
|
||||
.lambda("self"),
|
||||
)
|
||||
.apply(Term::list_values(vec![
|
||||
Constant::Data(Data::integer(1.into())),
|
||||
Constant::Data(Data::integer(3.into())),
|
||||
])),
|
||||
),
|
||||
)
|
||||
.apply(Term::data(Data::list(vec![Data::integer(1.into())]))),
|
||||
false,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user