66 lines
1.2 KiB
Rust
66 lines
1.2 KiB
Rust
mod utils;
|
|
|
|
use nix_js::value::Value;
|
|
use utils::eval;
|
|
|
|
#[test]
|
|
fn arithmetic() {
|
|
assert_eq!(eval("1 + 1"), Value::Int(2));
|
|
}
|
|
|
|
#[test]
|
|
fn simple_function_application() {
|
|
assert_eq!(eval("(x: x) 1"), Value::Int(1));
|
|
}
|
|
|
|
#[test]
|
|
fn curried_function() {
|
|
assert_eq!(eval("(x: y: x - y) 2 1"), Value::Int(1));
|
|
}
|
|
|
|
#[test]
|
|
fn rec_attrset() {
|
|
assert_eq!(eval("rec { b = a; a = 1; }.b"), Value::Int(1));
|
|
}
|
|
|
|
#[test]
|
|
fn let_binding() {
|
|
assert_eq!(eval("let b = a; a = 1; in b"), Value::Int(1));
|
|
}
|
|
|
|
#[test]
|
|
fn fibonacci() {
|
|
assert_eq!(
|
|
eval(
|
|
"let fib = n: if n == 1 || n == 2 then 1 else (fib (n - 1)) + (fib (n - 2)); in fib 30"
|
|
),
|
|
Value::Int(832040)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn fixed_point_combinator() {
|
|
assert_eq!(
|
|
eval("((f: let x = f x; in x)(self: { x = 1; y = self.x + 1; })).y"),
|
|
Value::Int(2)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn conditional_true() {
|
|
assert_eq!(eval("if true then 1 else 0"), Value::Int(1));
|
|
}
|
|
|
|
#[test]
|
|
fn conditional_false() {
|
|
assert_eq!(eval("if false then 1 else 0"), Value::Int(0));
|
|
}
|
|
|
|
#[test]
|
|
fn nested_let() {
|
|
assert_eq!(
|
|
eval("let x = 1; in let y = x + 1; z = y + 1; in z"),
|
|
Value::Int(3)
|
|
);
|
|
}
|