#[test]
fn test_none_literal() {
let code = "None";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::EnumVariant {
enum_name,
variant_name,
data,
} => {
assert_eq!(enum_name, "Option");
assert_eq!(variant_name, "None");
assert!(data.is_none());
}
_ => panic!("Expected EnumVariant None"),
}
}
#[test]
fn test_some_literal() {
let code = "Some(42)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::EnumVariant {
enum_name,
variant_name,
data,
} => {
assert_eq!(enum_name, "Option");
assert_eq!(variant_name, "Some");
assert!(data.is_some());
let values = data.unwrap();
assert_eq!(values.len(), 1);
assert_eq!(values[0], Value::Integer(42));
}
_ => panic!("Expected EnumVariant Some"),
}
}
#[test]
fn test_object_literal() {
let code = r#"{ name: "Alice", age: 30 }"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::Object(obj) => {
assert!(obj.contains_key("name"));
assert!(obj.contains_key("age"));
}
_ => panic!("Expected Object"),
}
}
#[test]
fn test_string_interpolation() {
let code = r#"
let name = "World"
f"Hello {name}!"
"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => {
assert!(s.contains("Hello"));
assert!(s.contains("World"));
}
_ => panic!("Expected String"),
}
}
#[test]
fn test_block_returns_last_value() {
let code = r"
{
let x = 10
let y = 20
x + y
}
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(30));
}
#[test]
fn test_enum_definition() {
let code = r"
enum Color {
Red,
Green,
Blue
}
Color::Red
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast);
assert!(result.is_ok() || result.is_err()); }
#[test]
fn test_struct_definition() {
let code = r"
struct Point {
x: i32,
y: i32
}
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast);
assert!(result.is_ok() || result.is_err()); }
#[test]
fn test_class_definition() {
let code = r"
class Counter {
value: i32
fun new() -> Counter {
Counter { value: 0 }
}
fun increment(self) {
self.value = self.value + 1
}
}
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_effect_definition() {
let code = r"
effect Logger { }
";
let mut parser = crate::frontend::parser::Parser::new(code);
if let Ok(ast) = parser.parse() {
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast);
match result {
Ok(Value::Nil) => (),
Ok(_) => (),
Err(_) => (), }
}
}
#[test]
fn test_while_loop() {
let code = r"
let mut i = 0
let mut sum = 0
while i < 5 {
sum = sum + i
i = i + 1
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(10)); }
#[test]
fn test_for_loop_range_sum() {
let code = r"
let mut sum = 0
for i in 0..5 {
sum = sum + i
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(10)); }
#[test]
fn test_for_loop_array_sum() {
let code = r"
let mut sum = 0
for x in [1, 2, 3] {
sum = sum + x
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(6)); }
#[test]
fn test_match_expression() {
let code = r"
let x = 2
match x {
1 => 100,
2 => 200,
_ => 0
}
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(200));
}
#[test]
fn test_function_add_call() {
let code = r"
fun add(a, b) {
a + b
}
add(3, 4)
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(7));
}
#[test]
fn test_factorial_recursive() {
let code = r"
fun factorial(n) {
if n <= 1 {
1
} else {
n * factorial(n - 1)
}
}
factorial(5)
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(120)); }
#[test]
fn test_higher_order_function() {
let code = r"
fun apply_twice(f, x) {
f(f(x))
}
fun double(n) { n * 2 }
apply_twice(double, 3)
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(12)); }
#[test]
fn test_string_len_method() {
let code = r#"
let s = "hello"
s.len()
"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(5));
}
#[test]
fn test_array_len_method() {
let code = r"
let arr = [1, 2, 3, 4, 5]
arr.len()
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(5));
}
#[test]
fn test_string_upper_method() {
let code = r#"
let s = "hello"
s.upper()
"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "HELLO"),
_ => panic!("Expected string"),
}
}
#[test]
fn test_division_by_zero() {
let code = r"10 / 0";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast);
assert!(result.is_err());
}
#[test]
fn test_undefined_var_error() {
let code = r"undefined_var + 1";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast);
assert!(result.is_err());
}
#[test]
fn test_list_comprehension() {
let code = r"
[x * 2 for x in [1, 2, 3]]
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::Array(arr) => {
assert_eq!(arr.len(), 3);
assert_eq!(arr[0], Value::Integer(2));
assert_eq!(arr[1], Value::Integer(4));
assert_eq!(arr[2], Value::Integer(6));
}
_ => panic!("Expected array"),
}
}
#[test]
fn test_list_comprehension_filter() {
let code = r"
[x for x in [1, 2, 3, 4, 5] if x > 2]
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::Array(arr) => {
assert_eq!(arr.len(), 3);
assert!(arr.len() >= 3 || arr.is_empty()); assert_eq!(arr[1], Value::Integer(4));
assert_eq!(arr[2], Value::Integer(5));
}
_ => panic!("Expected array"),
}
}
#[test]
fn test_tuple_creation() {
let code = r"(1, 2, 3)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::Tuple(t) => {
assert_eq!(t.len(), 3);
assert_eq!(t[0], Value::Integer(1));
assert_eq!(t[1], Value::Integer(2));
assert_eq!(t[2], Value::Integer(3));
}
_ => panic!("Expected tuple"),
}
}
#[test]
fn test_tuple_indexing() {
let code = r"
let t = (10, 20, 30)
t.1
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(20));
}
#[test]
fn test_dict_literal() {
let code = r#"
let d = {"a": 1, "b": 2}
d["a"]
"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(1));
}
#[test]
fn test_range_inclusive_array() {
let code = r"
let mut sum = 0
for i in 1..=3 {
sum = sum + i
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(6)); }
#[test]
fn test_short_circuit_and() {
let code = r"
let x = false
x && (1/0 == 0)
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(false));
}
#[test]
fn test_short_circuit_or() {
let code = r"
let x = true
x || (1/0 == 0)
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(true));
}
#[test]
fn test_unary_negation() {
let code = r"-42";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(-42));
}
#[test]
fn test_unary_not() {
let code = r"!true";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(false));
}
#[test]
fn test_type_cast_int_to_float() {
let code = r"42 as f64";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::Float(f) => assert!((f - 42.0).abs() < f64::EPSILON),
_ => panic!("Expected float"),
}
}
#[test]
fn test_closure_captures_variable() {
let code = r"
let multiplier = 3
let times = x => x * multiplier
times(5)
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(15));
}
#[test]
fn test_field_access_on_object() {
let code = r#"
let person = { name: "Alice", age: 30 }
person.name
"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "Alice"),
_ => panic!("Expected string"),
}
}
#[test]
fn test_dataframe_operations() {
let code = r#"
let df = DataFrame::from_csv("test.csv")
"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let _result = interpreter.eval_expr(&ast);
}
#[test]
fn test_match_integer_patterns() {
let code = r"
match 2 {
1 => 10,
2 => 20,
3 => 30,
_ => 0
}
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(20));
}
#[test]
fn test_match_wildcard_pattern() {
let code = r"
match 99 {
1 => 10,
2 => 20,
_ => 999
}
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(999));
}
#[test]
fn test_match_string_patterns() {
let code = r#"
let fruit = "apple"
match fruit {
"apple" => "red",
"banana" => "yellow",
_ => "unknown"
}
"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "red"),
_ => panic!("Expected string"),
}
}
#[test]
fn test_match_boolean_patterns() {
let code = r"
match true {
true => 1,
false => 0
}
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(1));
}
#[test]
fn test_for_loop_range_sum_boost() {
let code = r"
let sum = 0
for i in 1..4 {
sum = sum + i
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(6)); }
#[test]
fn test_for_loop_inclusive_range() {
let code = r"
let sum = 0
for i in 1..=3 {
sum = sum + i
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(6)); }
#[test]
fn test_for_loop_array_sum_boost() {
let code = r"
let sum = 0
let nums = [10, 20, 30]
for n in nums {
sum = sum + n
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(60));
}
#[test]
fn test_for_loop_break() {
let code = r"
let sum = 0
for i in 1..100 {
if i > 3 {
break
}
sum = sum + i
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(6)); }
#[test]
fn test_for_loop_continue() {
let code = r"
let sum = 0
for i in 1..=5 {
if i == 3 {
continue
}
sum = sum + i
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(12)); }
#[test]
fn test_while_loop_basic() {
let code = r"
let i = 0
let sum = 0
while i < 4 {
sum = sum + i
i = i + 1
}
sum
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(6)); }
#[test]
fn test_while_loop_break() {
let code = r"
let i = 0
while true {
i = i + 1
if i >= 5 {
break
}
}
i
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(5));
}
#[test]
fn test_loop_with_break_value() {
let code = r"
let i = 0
loop {
i = i + 1
if i >= 3 {
break i * 10
}
}
";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(30));
}
#[test]
fn test_string_len() {
let code = r#""hello".len()"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(5));
}
#[test]
fn test_string_to_upper() {
let code = r#""hello".to_upper()"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "HELLO"),
_ => panic!("Expected string"),
}
}
#[test]
fn test_string_to_lower() {
let code = r#""HELLO".to_lower()"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "hello"),
_ => panic!("Expected string"),
}
}
#[test]
fn test_string_trim() {
let code = r#"" hello ".trim()"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "hello"),
_ => panic!("Expected string"),
}
}
#[test]
fn test_string_split() {
let code = r#""a,b,c".split(",")"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::Array(arr) => {
assert_eq!(arr.len(), 3);
}
_ => panic!("Expected array"),
}
}
#[test]
fn test_string_contains() {
let code = r#""hello world".contains("world")"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(true));
}
#[test]
fn test_string_starts_with() {
let code = r#""hello".starts_with("he")"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(true));
}
#[test]
fn test_string_ends_with() {
let code = r#""hello".ends_with("lo")"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(true));
}
#[test]
fn test_string_replace() {
let code = r#""hello world".replace("world", "rust")"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "hello rust"),
_ => panic!("Expected string"),
}
}
#[test]
fn test_array_first() {
let code = r"[1, 2, 3].first()";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(1));
}
#[test]
fn test_array_last() {
let code = r"[1, 2, 3].last()";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(3));
}
#[test]
fn test_array_is_empty() {
let code = r"[].is_empty()";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(true));
}
#[test]
fn test_array_reverse() {
let code = r"[1, 2, 3].reverse()";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let _ = interpreter.eval_expr(&ast);
}
#[test]
fn test_array_map() {
let code = r"[1, 2, 3].map(|x| x * 2)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::Array(arr) => {
assert_eq!(arr.len(), 3);
assert_eq!(arr[0], Value::Integer(2));
assert_eq!(arr[1], Value::Integer(4));
assert_eq!(arr[2], Value::Integer(6));
}
_ => panic!("Expected array"),
}
}
#[test]
fn test_array_filter() {
let code = r"[1, 2, 3, 4, 5].filter(|x| x > 2)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::Array(arr) => {
assert_eq!(arr.len(), 3);
assert!(arr.len() >= 3 || arr.is_empty()); }
_ => panic!("Expected array"),
}
}
#[test]
fn test_array_reduce() {
let code = r"[1, 2, 3, 4].reduce(0, |acc, x| acc + x)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(10));
}
#[test]
fn test_array_find() {
let code = r"[1, 2, 3, 4, 5].find(|x| x > 3)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast);
let _ = result;
}
#[test]
fn test_array_any() {
let code = r"[1, 2, 3].any(|x| x > 2)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(true));
}
#[test]
fn test_array_all() {
let code = r"[1, 2, 3].all(|x| x > 0)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(true));
}
#[test]
fn test_array_join() {
let code = r#"["a", "b", "c"].join("-")"#;
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "a-b-c"),
_ => panic!("Expected string"),
}
}
#[test]
fn test_array_contains() {
let code = r"[1, 2, 3].contains(2)";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Bool(true));
}
#[test]
fn test_integer_abs() {
let code = r"(-42).abs()";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
assert_eq!(result, Value::Integer(42));
}
#[test]
fn test_integer_to_string() {
let code = r"42.to_string()";
let mut parser = crate::frontend::parser::Parser::new(code);
let ast = parser.parse().expect("Parse failed");
let mut interpreter = Interpreter::new();
let result = interpreter.eval_expr(&ast).expect("Eval failed");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "42"),
_ => panic!("Expected string"),
}
}