125 lines
2.5 KiB
Rust
125 lines
2.5 KiB
Rust
mod utils;
|
|
|
|
use nix_js::value::Value;
|
|
use utils::{eval, eval_result};
|
|
|
|
#[test]
|
|
fn required_parameters() {
|
|
assert_eq!(eval("({ a, b }: a + b) { a = 1; b = 2; }"), Value::Int(3));
|
|
}
|
|
|
|
#[test]
|
|
fn missing_required_parameter() {
|
|
let result = eval_result("({ a, b }: a + b) { a = 1; }");
|
|
assert!(result.is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn all_required_parameters_present() {
|
|
assert_eq!(
|
|
eval("({ x, y, z }: x + y + z) { x = 1; y = 2; z = 3; }"),
|
|
Value::Int(6)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn reject_unexpected_arguments() {
|
|
let result = eval_result("({ a, b }: a + b) { a = 1; b = 2; c = 3; }");
|
|
assert!(result.is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn ellipsis_accepts_extra_arguments() {
|
|
assert_eq!(
|
|
eval("({ a, b, ... }: a + b) { a = 1; b = 2; c = 3; }"),
|
|
Value::Int(3)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn default_parameters() {
|
|
assert_eq!(eval("({ a, b ? 5 }: a + b) { a = 1; }"), Value::Int(6));
|
|
}
|
|
|
|
#[test]
|
|
fn override_default_parameter() {
|
|
assert_eq!(
|
|
eval("({ a, b ? 5 }: a + b) { a = 1; b = 10; }"),
|
|
Value::Int(11)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn at_pattern_alias() {
|
|
assert_eq!(
|
|
eval("(args@{ a, b }: args.a + args.b) { a = 1; b = 2; }"),
|
|
Value::Int(3)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn simple_parameter_no_validation() {
|
|
assert_eq!(eval("(x: x.a + x.b) { a = 1; b = 2; }"), Value::Int(3));
|
|
}
|
|
|
|
#[test]
|
|
fn simple_parameter_accepts_any_argument() {
|
|
assert_eq!(eval("(x: x) 42"), Value::Int(42));
|
|
}
|
|
|
|
#[test]
|
|
fn nested_function_parameters() {
|
|
assert_eq!(
|
|
eval("({ a }: { b }: a + b) { a = 5; } { b = 3; }"),
|
|
Value::Int(8)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn pattern_param_simple_reference_in_default() {
|
|
assert_eq!(
|
|
eval("({ a, b ? a }: b) { a = 10; }"),
|
|
Value::Int(10)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn pattern_param_multiple_references_in_default() {
|
|
assert_eq!(
|
|
eval("({ a, b ? a + 5, c ? 1 }: b + c) { a = 10; }"),
|
|
Value::Int(16)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn pattern_param_mutual_reference() {
|
|
assert_eq!(
|
|
eval("({ a, b ? c + 1, c ? 5 }: b) { a = 1; }"),
|
|
Value::Int(6)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn pattern_param_override_mutual_reference() {
|
|
assert_eq!(
|
|
eval("({ a, b ? c + 1, c ? 5 }: b) { a = 1; c = 10; }"),
|
|
Value::Int(11)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn pattern_param_reference_list() {
|
|
assert_eq!(
|
|
eval("({ a, b ? [ a 2 ] }: builtins.elemAt b 0) { a = 42; }"),
|
|
Value::Int(42)
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn pattern_param_alias_in_default() {
|
|
assert_eq!(
|
|
eval("(args@{ a, b ? args.a + 10 }: b) { a = 5; }"),
|
|
Value::Int(15)
|
|
);
|
|
}
|