chore: add if_else optimization test
This commit is contained in:
parent
6456001cbc
commit
0c3dc0580a
|
@ -504,6 +504,7 @@ mod test {
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{Constant, Name, NamedDeBruijn, Program, Term},
|
ast::{Constant, Name, NamedDeBruijn, Program, Term},
|
||||||
|
builtins::DefaultFunction,
|
||||||
parser::interner::Interner,
|
parser::interner::Interner,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -780,4 +781,63 @@ mod test {
|
||||||
|
|
||||||
assert_eq!(actual, expected);
|
assert_eq!(actual, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn builtin_force_reduce_if_builtin() {
|
||||||
|
let program: Program<Name> = Program {
|
||||||
|
version: (1, 0, 0),
|
||||||
|
term: Term::equals_integer()
|
||||||
|
.apply(Term::var("x"))
|
||||||
|
.apply(
|
||||||
|
Term::add_integer()
|
||||||
|
.apply(Term::integer(2.into()))
|
||||||
|
.apply(Term::var("y")),
|
||||||
|
)
|
||||||
|
.delayed_if_else(
|
||||||
|
Term::length_of_bytearray().apply(Term::byte_string(vec![])),
|
||||||
|
Term::Error,
|
||||||
|
)
|
||||||
|
.lambda("x")
|
||||||
|
.lambda("y"),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut expected = Program {
|
||||||
|
version: (1, 0, 0),
|
||||||
|
term: Term::var("__if_then_else_wrapped")
|
||||||
|
.apply(
|
||||||
|
Term::equals_integer().apply(Term::var("x")).apply(
|
||||||
|
Term::add_integer()
|
||||||
|
.apply(Term::integer(2.into()))
|
||||||
|
.apply(Term::var("y")),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.apply(
|
||||||
|
Term::length_of_bytearray()
|
||||||
|
.apply(Term::byte_string(vec![]))
|
||||||
|
.delay(),
|
||||||
|
)
|
||||||
|
.apply(Term::Error.delay())
|
||||||
|
.force()
|
||||||
|
.lambda("x")
|
||||||
|
.lambda("y")
|
||||||
|
.lambda("__if_then_else_wrapped")
|
||||||
|
.apply(Term::Builtin(DefaultFunction::IfThenElse).force()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut interner = Interner::new();
|
||||||
|
|
||||||
|
interner.program(&mut expected);
|
||||||
|
|
||||||
|
let expected: Program<NamedDeBruijn> = expected.try_into().unwrap();
|
||||||
|
|
||||||
|
let mut actual = program.builtin_force_reduce();
|
||||||
|
|
||||||
|
let mut interner = Interner::new();
|
||||||
|
|
||||||
|
interner.program(&mut actual);
|
||||||
|
|
||||||
|
let actual: Program<NamedDeBruijn> = actual.try_into().unwrap();
|
||||||
|
|
||||||
|
assert_eq!(actual, expected);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue