mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
Tests for arrays builtins
Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
committed by
Anand Krishnamoorthi
parent
c4ae2d4cc2
commit
17257f9f1d
+28
-4
@@ -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, ¶ms[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, ¶ms[0], args[0].clone())?;
|
||||
let start = ensure_numeric(name, ¶ms[1], &args[1].clone())?;
|
||||
let stop = ensure_numeric(name, ¶ms[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()))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user