use unlambda::*;
macro_rules! assert_evals_to {
($src:expr, $expect:expr $(,)?) => {
assert_evals_to!($src, $expect, "");
};
($src:expr, $expect:expr, $input:expr $(,)?) => {
let e = eval_to_string($src, Input::Str($input)).unwrap_or_else(|e| {
panic!("Failed to evaluate {:?}: {:?}", $src, e);
});
assert_eq!(&*e, $expect, "{:?} did not evaluate as expected", $src);
};
}
#[test]
fn hellos() {
assert_evals_to!("`.!`.d`.l`.r`.o`.w`. `.,`.o`.l`.l`.e`.Hi", "Hello, world!");
assert_evals_to!(
"
```si`k``s.H``s.e``s.l``s.l``s.o``s. \
``s.w``s.o``s.r``s.l``s.d``s.!``sri
``si``si``si``si``si``si``si``si`ki
",
"Hello world!\nHello world!\nHello world!\nHello world!\nHello world!\nHello world!\nHello world!\nHello world!\n",
);
}
#[test]
fn cat() {
assert_evals_to!("``cd``d`@|`cd", "example", "example");
assert_evals_to!("``cd``d`@|`cd", "", "");
assert_evals_to!("``cd``d`@|`cd", "1234", "1234");
}
#[test]
fn church() {
assert_evals_to!(
"```si`k``s.f``s.o``s.o``s.p``s. i``si``si``si`ki",
"foop foop foop ",
);
}
#[test]
fn quine0() {
let quine = concat!(
"``d.v```s``si`kv``si`k`d`..`.c`.s`.``.``.s`.``.`v",
"``s``sc.```s``sc.```s``sc.d``s``sc..``s``sc.v``s`",
"`sc.```s``sc.```s``sc.```s``sc.s``s``sc.```s``sc.",
"```s``sc.s``s``sc.i``s``sc.```s``sc.k``s``sc.v``s",
"``sc.```s``sc.```s``sc.s``s``sc.i``s``sc.```s``sc",
".k``s``sc.```s``sc.d``s``sc.```s``sc..``s``sc..``",
"s``sc.```s``sc..``s``sc.c``s``sc.```s``sc..``s``s",
"c.s``s``sc.```s``sc..``s``sc.```s``sc.```s``sc..`",
"`s``sc.```s``sc.```s``sc..``s``sc.s``s``sc.```s``",
"sc..``s``sc.```s``sc.```s``sc..``s``sc.```s``sc.vv"
);
assert_evals_to!(quine, quine);
}
#[test]
fn quine10() {
let quine = include_str!("fixtures/quine10.unl");
assert_evals_to!(quine, quine);
}
#[test]
fn squares() {
assert_evals_to!(
"`r```si`k``s ``s`kk `si ``s``si`k ``s`k`s`k ``sk ``sr`k.* i r``si``si``si``si``si``si``si``si``si`k`ki",
include_str!("fixtures/square_out.txt"),
);
}
#[test]
fn unl_test_g0() {
assert_evals_to!("`r`.*i", "*\n");
assert_evals_to!("`r`d`.*i", "\n");
assert_evals_to!("`r``d.*i", "*\n");
assert_evals_to!("`r``id`.*i", "\n");
assert_evals_to!("`r``dd`.*i", "*\n");
assert_evals_to!("`r```kdi`.*i", "\n");
assert_evals_to!("`r```sd.*i", "*\n");
assert_evals_to!("`r```s`kd`.*ii", "*\n");
}
#[test]
fn unl_test_g1() {
assert_evals_to!("`r```s`k.*`kii", "*\n");
assert_evals_to!("`r``k`.*ii", "*\n");
assert_evals_to!("`r```si`ki.*", "*\n");
assert_evals_to!("`r```s`k.*ii", "*\n");
}
#[test]
fn unl_test_g2() {
assert_evals_to!("`r```s`kd``s`k.*`kii", "\n");
assert_evals_to!("`r```s`kd`k`.*ii", "*\n");
assert_evals_to!("`r``k`d`.*ii", "\n");
assert_evals_to!("`r```si``s`k.*`kid", "\n");
assert_evals_to!("`r```si`k`.*id", "*\n");
assert_evals_to!("`r```s`kd``sii.*", "\n");
assert_evals_to!("`r```s`kd``s`k.*ii", "\n");
assert_evals_to!("`r```s`kd.*i", "\n");
}
#[test]
fn unl_test_g4() {
assert_evals_to!("`r```s``s`kd`k.*`kii", "*\n");
assert_evals_to!("`r```s`k`d.*`kii", "*\n");
assert_evals_to!("`r``k``d.*ii", "*\n");
assert_evals_to!("`r```s``si`k.*`kid", "*\n");
assert_evals_to!("`r```s``s`kdi`ki.*", "*\n");
assert_evals_to!("`r```sd`ki.*", "*\n");
assert_evals_to!("`r```s``s`kd`k.*ii", "*\n");
assert_evals_to!("`r```s`k`d.*ii", "*\n");
}
#[test]
fn unl_test_g5() {
assert_evals_to!("`r```s``s`ki`kd``s`k.*`kii", "\n");
assert_evals_to!("`r```s``s`ki`kd`k`.*ii", "*\n");
assert_evals_to!("`r```s`k`id``s`k.*`kii", "\n");
assert_evals_to!("`r```s`k`id`k`.*ii", "*\n");
assert_evals_to!("`r``k``id`.*ii", "\n");
assert_evals_to!("`r```s``si`kd``s`k.*`kii", "\n");
assert_evals_to!("`r```s``si`kd`k`.*ii", "*\n");
assert_evals_to!("`r```s``s`ki`kd``s`k.*ii", "\n");
assert_evals_to!("`r```s`k`id``s`k.*ii", "\n");
assert_evals_to!("`r```s``s`ki`kd.*i", "\n");
assert_evals_to!("`r```s`k`id.*i", "\n");
assert_evals_to!("`r```s``si`kd``s`k.*ii", "\n");
assert_evals_to!("`r```s``si`kd.*i", "\n");
assert_evals_to!("`r```s``s`kii``s`k.*`kid", "\n");
assert_evals_to!("`r```s``s`kii`k`.*id", "*\n");
assert_evals_to!("`r```si``s`k.*`kid", "\n");
assert_evals_to!("`r```si`k`.*id", "*\n");
assert_evals_to!("`r```s``s`ki`kd``si`ki.*", "\n");
assert_evals_to!("`r```s`k`id``si`ki.*", "\n");
}
#[test]
fn unl_test_g6() {
assert_evals_to!("`r```s``s`kd`kd``s`k.*`kii", "*\n");
assert_evals_to!("`r```s``s`kd`kd`k`.*ii", "*\n");
assert_evals_to!("`r```s`k`dd``s`k.*`kii", "*\n");
assert_evals_to!("`r```s`k`dd`k`.*ii", "*\n");
assert_evals_to!("`r``k``dd`.*ii", "*\n");
assert_evals_to!("`r```s``s`kd`kd``s`k.*ii", "*\n");
assert_evals_to!("`r```s`k`dd``s`k.*ii", "*\n");
assert_evals_to!("`r```s``s`kd`kd.*i", "*\n");
assert_evals_to!("`r```s`k`dd.*i", "*\n");
assert_evals_to!("`r```s``s`kdi``s`k.*`kid", "*\n");
assert_evals_to!("`r```s``s`kdi`k`.*id", "*\n");
assert_evals_to!("`r```sd``s`k.*`kid", "*\n");
assert_evals_to!("`r```sd`k`.*id", "*\n");
assert_evals_to!("`r```s``si`kd``s`k.*`kid", "*\n");
assert_evals_to!("`r```s``si`kd`k`.*id", "*\n");
assert_evals_to!("`r```s``sii``s`k.*`kid", "*\n");
assert_evals_to!("`r```s``sii`k`.*id", "*\n");
assert_evals_to!("`r```s``s`kd`kd``si`ki.*", "*\n");
assert_evals_to!("`r```s`k`dd``si`ki.*", "*\n");
}
#[test]
fn unl_test_g7() {
assert_evals_to!("`r```s``s``s`kk`kd`ki``s`k.*`kii", "\n");
assert_evals_to!("`r```s``s``s`kk`kd`ki`k`.*ii", "*\n");
assert_evals_to!("`r```s``s`k`kd`ki``s`k.*`kii", "\n");
assert_evals_to!("`r```s``s`k`kd`ki`k`.*ii", "*\n");
assert_evals_to!("`r```s`k``kdi``s`k.*`kii", "\n");
assert_evals_to!("`r```s`k``kdi`k`.*ii", "*\n");
assert_evals_to!("`r``k```kdi`.*ii", "\n");
assert_evals_to!("`r```s``s``si`kd`ki``s`k.*`kik", "\n");
assert_evals_to!("`r```s``s``si`kd`ki`k`.*ik", "*\n");
assert_evals_to!("`r```s``s``s`kki`ki``s`k.*`kid", "\n");
assert_evals_to!("`r```s``s``s`kki`ki`k`.*id", "*\n");
assert_evals_to!("`r```s``sk`ki``s`k.*`kid", "\n");
assert_evals_to!("`r```s``sk`ki`k`.*id", "*\n");
assert_evals_to!("`r```s``s``s`kk`kdi``s`k.*`kii", "\n");
assert_evals_to!("`r```s``s`k`kdi``s`k.*`kii", "\n");
assert_evals_to!("`r```s`kd``s`k.*`kii", "\n");
assert_evals_to!("`r```s``s``s`kk`kdi`k`.*ii", "*\n");
assert_evals_to!("`r```s``s``s`kk`kd`ki``s`k.*ii", "\n");
assert_evals_to!("`r```s``s`k`kd`ki``s`k.*ii", "\n");
assert_evals_to!("`r```s`k``kdi``s`k.*ii", "\n");
assert_evals_to!("`r```s``s``s`kk`kdi.*i", "\n");
assert_evals_to!("`r```s``s`k`kd`ki.*i", "\n");
assert_evals_to!("`r```s`k``kdi.*i", "\n");
assert_evals_to!("`r```s``s``s`kk`kdi``s`k.*ii", "\n");
assert_evals_to!("`r```s``s`k`kdi``s`k.*ii", "\n");
assert_evals_to!("`r```s``s``s`kk`kd`ki``si`ki.*", "\n");
assert_evals_to!("`r```s``s`k`kd`ki``si`ki.*", "\n");
assert_evals_to!("`r```s`k``kdi``si`ki.*", "\n");
}
#[test]
fn unl_test_g8() {
assert_evals_to!("`r```s``s``s`ks``s`kk`kd`k.*`kii", "\n");
assert_evals_to!("`r```s``s``s`ks`k`kd`k.*`kii", "\n");
assert_evals_to!("`r```s``s`k`s`kd`k.*`kii", "\n");
assert_evals_to!("`r```s`k``s`kd.*`kii", "\n");
assert_evals_to!("`r``k```s`kd.*ii", "\n");
assert_evals_to!("`r```s``s``si``s`kk`kd`k.*`kis", "\n");
assert_evals_to!("`r```s``s``si`k`kd`k.*`kis", "\n");
assert_evals_to!("`r```s``s``s`ks``si`kd`k.*`kik", "\n");
assert_evals_to!("`r```s``s``s`ks``s`kki`k.*`kid", "\n");
assert_evals_to!("`r```s``s``s`ksk`k.*`kid", "\n");
assert_evals_to!("`r```s``s``s`ks``s`kk`kdi`ki.*", "\n");
assert_evals_to!("`r```s``s``s`ks`k`kdi`ki.*", "\n");
assert_evals_to!("`r```s``s`k`s`kdi`ki.*", "\n");
assert_evals_to!("`r```s`s`kd`ki.*", "\n");
assert_evals_to!("`r```s``s``s`ks``s`kk`kd`k.*ii", "\n");
assert_evals_to!("`r```s``s``s`ks`k`kd`k.*ii", "\n");
assert_evals_to!("`r```s``s`k`s`kd`k.*ii", "\n");
assert_evals_to!("`r```s`k``s`kd.*ii", "\n");
}
#[test]
fn unl_test_g9() {
assert_evals_to!("`r```s``s``s`ks``s`kk`kd``ssi`k.*i", "\n");
assert_evals_to!("`r```s``s``s`ks``s`kk`kds`k.*i", "\n");
assert_evals_to!("`r```s``s``s`ks`k`kd``ssi`k.*i", "\n");
assert_evals_to!("`r```s``s``s`ks`k`kds`k.*i", "\n");
assert_evals_to!("`r```s``s`k`s`kd``ssi`k.*i", "\n");
assert_evals_to!("`r```s``s`k`s`kds`k.*i", "\n");
}