use aethershell::value::Value;
fn eval_str(src: &str) -> Value {
let stmts = aethershell::parser::parse_program(src).expect("parse");
let mut env = aethershell::env::Env::new();
aethershell::eval::eval_program(&stmts, &mut env).expect("eval")
}
#[test]
fn pipe_field_projection() {
let r = eval_str(r#"[{name: "a", size: 1}, {name: "b", size: 2}] |.name"#);
assert_eq!(
r,
Value::Array(vec![Value::Str("a".into()), Value::Str("b".into())])
);
}
#[test]
fn pipe_field_projection_chains() {
let r = eval_str(r#"[{a: {b: 5}}, {a: {b: 6}}] |.a.b"#);
assert_eq!(r, Value::Array(vec![Value::Int(5), Value::Int(6)]));
}
#[test]
fn si_numeric_suffixes() {
assert_eq!(eval_str("1k"), Value::Int(1000));
assert_eq!(eval_str("5M"), Value::Int(5_000_000));
assert_eq!(eval_str("2G"), Value::Int(2_000_000_000));
assert_eq!(eval_str("1k + 5"), Value::Int(1005));
}
#[test]
fn legible_forms_are_native() {
assert_eq!(
eval_str("'single quoted'"),
Value::Str("single quoted".into())
);
assert_eq!(eval_str("x := 5; x"), Value::Int(5)); assert_eq!(eval_str("true"), Value::Bool(true));
assert_eq!(eval_str("null"), Value::Null);
}
#[test]
fn if_expression() {
assert_eq!(
eval_str(r#"if 1 < 2 { "yes" } else { "no" }"#),
Value::Str("yes".into())
);
assert_eq!(
eval_str(r#"if 2 < 1 { "yes" } else { "no" }"#),
Value::Str("no".into())
);
assert_eq!(eval_str(r#"if 2 < 1 { "yes" }"#), Value::Null);
assert_eq!(
eval_str(r#"let x = if true { 10 } else { 20 }; x"#),
Value::Int(10)
);
}
#[test]
fn question_match_prefix() {
assert_eq!(
eval_str(r#"?2 { 1 => "a", 2 => "b", _ => "z" }"#),
Value::Str("b".into())
);
assert_eq!(
eval_str(r#"?5 { 1 => "a", _ => "z" }"#),
Value::Str("z".into())
);
}
#[test]
fn tilde_lambda_in_pipeline() {
assert_eq!(
eval_str("[1, 2, 3] | map(~x: x * 2)"),
Value::Array(vec![Value::Int(2), Value::Int(4), Value::Int(6)])
);
assert_eq!(
eval_str("[1, 2, 3, 4] | where(~x: x > 2)"),
Value::Array(vec![Value::Int(3), Value::Int(4)])
);
assert_eq!(
eval_str("[1, 2, 3, 4] | reduce(~a, b: a + b, 0)"),
Value::Int(10)
);
}
#[test]
fn tilde_lambda_body_is_bounded_by_pipe() {
assert_eq!(
eval_str(r#"[{n: 3}, {n: 1}] | where(~x: x.n > 2) |.n"#),
Value::Array(vec![Value::Int(3)])
);
}
#[test]
fn pipe_field_projection_composes_with_other_stages() {
let r = eval_str(
r#"[{name: "a", size: 5}, {name: "b", size: 1}] | where(fn(x) => x.size > 2) |.name"#,
);
assert_eq!(r, Value::Array(vec![Value::Str("a".into())]));
}