use vexity::{
interpreter::{Interpreter, VarValue},
parser::parse,
};
#[test]
fn test_map_to_hashmaps() {
let script = r#"
let nums = [10, 20]
let result = nums.map(|x| {
val: x,
double: x * 2
})
"#;
let statements = parse(script).expect("Parsing failed");
let mut interpreter = Interpreter::new();
interpreter.run(statements);
let result = interpreter
.vars
.get("result")
.and_then(|v| match v {
VarValue::Array(a) => Some(a),
_ => None,
})
.expect("Expected result array");
assert_eq!(result.len(), 2);
let first = match &result[0] {
VarValue::HashMap(m) => m,
_ => panic!("Expected HashMap"),
};
assert_eq!(
first.get("val").map(|x| match x {
VarValue::Int(x) => *x,
_ => panic!("Expected VarValue::Int"),
}),
Some(10)
);
assert_eq!(
first.get("double").map(|x| match x {
VarValue::Int(x) => *x,
_ => panic!("Expected VarValue::Int"),
}),
Some(20)
);
let second = match &result[1] {
VarValue::HashMap(m) => m,
_ => panic!("Expected HashMap"),
};
assert_eq!(
second.get("val").map(|x| match x {
VarValue::Int(x) => *x,
_ => panic!("Expected VarValue::Int"),
}),
Some(20)
);
assert_eq!(
second.get("double").map(|x| match x {
VarValue::Int(x) => *x,
_ => panic!("Expected VarValue::Int"),
}),
Some(40)
);
}
#[test]
fn test_map_with_function() {
let script = r#"
fn add_one(x) {
x + 1
}
let nums = [1, 2, 3]
let incremented = nums.map(add_one)
"#;
let statements = parse(script).expect("Parsing failed");
let mut interpreter = Interpreter::new();
interpreter.run(statements);
let incremented = interpreter
.vars
.get("incremented")
.and_then(|v| match v {
VarValue::Array(a) => Some(
a.iter()
.map(|v| match v {
VarValue::Int(i) => *i,
_ => panic!("Expected Int"),
})
.collect::<Vec<i32>>(),
),
_ => None,
})
.expect("Expected array of incremented values");
assert_eq!(incremented, vec![2, 3, 4]);
}