Tests for arrays builtins

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
Anand Krishnamoorthi
2023-02-21 23:00:39 -08:00
committed by Anand Krishnamoorthi
parent c4ae2d4cc2
commit 17257f9f1d
4 changed files with 228 additions and 4 deletions
+28 -4
View File
@@ -3,7 +3,7 @@
use crate::ast::Expr;
use crate::builtins;
use crate::builtins::utils::{ensure_args_count, ensure_array};
use crate::builtins::utils::{ensure_args_count, ensure_array, ensure_numeric};
use crate::lexer::Span;
use crate::value::Value;
@@ -15,6 +15,7 @@ use std::rc::Rc;
pub fn register(m: &mut HashMap<&'static str, builtins::BuiltinFcn>) {
m.insert("array.concat", concat);
m.insert("array.reverse", reverse);
m.insert("array.slice", slice);
}
fn concat(span: &Span, params: &[Expr], args: &[Value]) -> Result<Value> {
@@ -29,13 +30,36 @@ fn concat(span: &Span, params: &[Expr], args: &[Value]) -> Result<Value> {
fn reverse(span: &Span, params: &[Expr], args: &[Value]) -> Result<Value> {
let name = "array.reverse";
ensure_args_count(span, name, params, args, 2)?;
ensure_args_count(span, name, params, args, 1)?;
let mut v1 = ensure_array(name, &params[0], args[0].clone())?;
Rc::make_mut(&mut v1).reverse();
Ok(Value::Array(v1))
}
/*
fn slice(span: &Span, params: &[Expr], args: &[Value]) -> Result<Value> {
*/
let name = "array.slice";
ensure_args_count(span, name, params, args, 3)?;
let array = ensure_array(name, &params[0], args[0].clone())?;
let start = ensure_numeric(name, &params[1], &args[1].clone())?;
let stop = ensure_numeric(name, &params[2], &args[2].clone())?;
if start != start.floor() || stop != stop.floor() {
return Ok(Value::Undefined);
}
// TODO: usize conversion checks.
let start = start as usize;
let stop = match stop as usize {
s if s > array.len() => array.len(),
s => s,
};
if start >= stop {
return Ok(Value::new_array());
}
let slice = &array[start..stop];
Ok(Value::from_array(slice.to_vec()))
}