#[test]
fn test_float_floor() {
let code = r"3.7.floor()";
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 - 3.0).abs() < f64::EPSILON),
Value::Integer(i) => assert_eq!(i, 3),
_ => panic!("Expected float or int"),
}
}
#[test]
fn test_float_ceil() {
let code = r"3.2.ceil()";
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 - 4.0).abs() < f64::EPSILON),
Value::Integer(i) => assert_eq!(i, 4),
_ => panic!("Expected float or int"),
}
}
#[test]
fn test_float_round() {
let code = r"3.5.round()";
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 - 4.0).abs() < f64::EPSILON),
Value::Integer(i) => assert_eq!(i, 4),
_ => panic!("Expected float or int"),
}
}
#[test]
fn test_float_abs() {
let code = r"(-3.5).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");
match result {
Value::Float(f) => assert!((f - 3.5).abs() < f64::EPSILON),
_ => panic!("Expected float"),
}
}
#[test]
fn test_tuple_access_first() {
let code = r"(1, 2, 3).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_tuple_access_second() {
let code = r"(1, 2, 3).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(2));
}
#[test]
fn test_tuple_len() {
let code = r"(1, 2, 3).len()";
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_range_exclusive() {
let code = r"1..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");
match result {
Value::Array(arr) => {
assert_eq!(arr.len(), 3);
}
Value::Range { .. } => {
}
_ => {} }
}
#[test]
fn test_range_inclusive_boost() {
let code = r"1..=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);
}
Value::Range { .. } => {
}
_ => {} }
}
#[test]
fn test_logical_and() {
let code = r"true && 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(true));
}
#[test]
fn test_logical_or() {
let code = r"false || 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(true));
}
#[test]
fn test_comparison_less() {
let code = r"1 < 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_comparison_greater() {
let code = r"2 > 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::Bool(true));
}
#[test]
fn test_comparison_less_equal() {
let code = r"2 <= 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_comparison_greater_equal() {
let code = r"2 >= 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_equality() {
let code = r"5 == 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::Bool(true));
}
#[test]
fn test_inequality() {
let code = r"5 != 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::Bool(true));
}
#[test]
fn test_bitwise_and() {
let code = r"5 & 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(1)); }
#[test]
fn test_bitwise_or() {
let code = r"5 | 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(7)); }
#[test]
fn test_bitwise_xor() {
let code = r"5 ^ 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(6)); }
#[test]
fn test_string_interpolation_simple() {
let code = r#"
let x = 42
f"Value is {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");
match result {
Value::String(s) => assert!(s.as_ref().contains("42")),
_ => panic!("Expected string"),
}
}
#[test]
fn test_string_interpolation_expression() {
let code = r#"
f"Sum is {1 + 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::String(s) => assert!(s.as_ref().contains("3")),
_ => panic!("Expected string"),
}
}
#[test]
fn test_compound_add_assign() {
let code = r"
let x = 5
x += 3
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(8));
}
#[test]
fn test_compound_sub_assign() {
let code = r"
let x = 10
x -= 3
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(7));
}
#[test]
fn test_compound_mul_assign() {
let code = r"
let x = 4
x *= 3
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(12));
}
#[test]
fn test_compound_div_assign() {
let code = r"
let x = 12
x /= 3
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(4));
}
#[test]
fn test_array_index_assignment() {
let code = r"
let arr = [1, 2, 3]
arr[1] = 42
arr[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(42));
}
#[test]
fn test_dict_access() {
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_dict_keys() {
let code = r#"
let d = {"a": 1, "b": 2}
d.keys()
"#;
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_dict_values() {
let code = r#"
let d = {"a": 1, "b": 2}
d.values()
"#;
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_if_true_branch() {
let code = r"if true { 1 } else { 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::Integer(1));
}
#[test]
fn test_if_false_branch() {
let code = r"if false { 1 } else { 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::Integer(2));
}
#[test]
fn test_if_else_if_chain() {
let code = r"
let x = 2
if x == 1 { 10 }
else if x == 2 { 20 }
else { 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");
assert_eq!(result, Value::Integer(20));
}
#[test]
fn test_function_add_boost() {
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_boost() {
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_struct_definition_and_instantiation() {
let code = r"
struct Point {
x: i64,
y: i64
}
let p = Point { x: 10, y: 20 }
p.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_struct_field_access() {
let code = r#"
struct Person {
name: String,
age: i64
}
let p = Person { name: "Alice", age: 30 }
p.age
"#;
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_variant_creation() {
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);
let _ = result;
}
#[test]
fn test_block_returns_last() {
let code = r"
{
let x = 1
let y = 2
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(3));
}
#[test]
fn test_early_return() {
let code = r"
fun check(x) {
if x > 5 {
return 100
}
x
}
check(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(100));
}
#[test]
fn test_list_comprehension_simple() {
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_comprehension_filter_boost() {
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()); }
_ => panic!("Expected array"),
}
}
#[test]
fn test_division_by_zero_error() {
let code = r"5 / 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_modulo_by_zero_error() {
let code = r"5 % 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_undef_var_boost() {
let code = r"undefined_var";
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_index_out_of_bounds_error() {
let code = r"[1, 2, 3][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);
assert!(result.is_err());
}
#[test]
fn test_class_definition_simple() {
let code = r"
class Counter {
count: i64
fun new() {
Counter { count: 0 }
}
fun increment(self) {
self.count = self.count + 1
}
}
";
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_impl_block() {
let code = r"
struct Point {
x: i64,
y: i64
}
impl Point {
fun new(x: i64, y: i64) -> Point {
Point { x: x, y: y }
}
}
";
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_module_definition() {
let code = r"
mod math {
fun square(x) {
x * x
}
}
";
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_pipeline_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 _ = interpreter.eval_expr(&ast);
}
#[test]
fn test_pipeline_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 _ = interpreter.eval_expr(&ast);
}
#[test]
fn test_try_catch_basic() {
let code = r#"
try {
throw "error"
} catch e {
"caught"
}
"#;
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_ok_expression() {
let code = r"Ok(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 { variant_name, .. } => {
assert_eq!(variant_name, "Ok");
}
_ => {} }
}
#[test]
fn test_err_expression() {
let code = r#"Err("error message")"#;
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 { variant_name, .. } => {
assert_eq!(variant_name, "Err");
}
_ => {} }
}
#[test]
fn test_await_expression() {
let code = r"
async fun get_value() {
42
}
";
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_spread_operator() {
let code = r"
let a = [1, 2]
let b = [0, ...a, 3]
b
";
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_destructuring_let() {
let code = r"
let (a, b) = (1, 2)
a + b
";
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_slice() {
let code = r"
let arr = [1, 2, 3, 4, 5]
arr[1..3]
";
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_nested_field_access() {
let code = r#"
let obj = { inner: { value: 42 } }
obj.inner.value
"#;
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_method_chaining() {
let code = r#""hello world".split(" ").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(2));
}
#[test]
fn test_assert_expression() {
let code = r"assert(true)";
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_typeof_expression() {
let code = r#"typeof(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);
let _ = result;
}
#[test]
fn test_builtin_len() {
let code = r"len([1, 2, 3, 4, 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(5));
}
#[test]
fn test_builtin_print() {
let code = r#"print("test")"#;
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_builtin_range_two_args() {
let code = r"range(1, 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");
match result {
Value::Array(arr) => {
assert_eq!(arr.len(), 4); }
_ => {} }
}
#[test]
fn test_builtin_sqrt() {
let code = r"sqrt(16)";
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 - 4.0).abs() < f64::EPSILON),
Value::Integer(i) => assert_eq!(i, 4),
_ => {} }
}
#[test]
fn test_builtin_pow() {
let code = r"pow(2, 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");
match result {
Value::Float(f) => assert!((f - 1024.0).abs() < f64::EPSILON),
Value::Integer(i) => assert_eq!(i, 1024),
_ => {} }
}
#[test]
fn test_builtin_abs_negative() {
let code = r"abs(-100)";
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(100));
}
#[test]
fn test_builtin_min() {
let code = r"min(5, 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(3));
}
#[test]
fn test_builtin_max() {
let code = r"max(5, 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(5));
}
#[test]
fn test_let_if_expression() {
let code = r"
let result = if true { 10 } else { 20 }
result
";
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_nested_lambda() {
let code = r"
let outer = |x| {
let inner = |y| y * 2
inner(x) + 1
}
outer(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(11)); }
#[test]
fn test_multiple_function_calls() {
let code = r"
fun double(x) { x * 2 }
fun triple(x) { x * 3 }
double(triple(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::Integer(12)); }
#[test]
fn test_string_char_access() {
let code = r#"
let s = "hello"
s[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");
match result {
Value::String(s) => assert_eq!(s.as_ref(), "h"),
_ => {} }
}
#[test]
fn test_modulo_operation() {
let code = r"17 % 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(2));
}
#[test]
fn test_float_division() {
let code = r"7.0 / 2.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");
match result {
Value::Float(f) => assert!((f - 3.5).abs() < f64::EPSILON),
_ => panic!("Expected float"),
}
}
#[test]
fn test_integer_division() {
let code = r"7 / 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::Integer(3));
}
#[test]
fn test_array_concat() {
let code = r"[1, 2] + [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);
let _ = result;
}
#[test]
fn test_string_repeat() {
let code = r#""ab" * 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_boolean_not_false() {
let code = r"!false";
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_mixed_arithmetic() {
let code = r"2 + 3 * 4 - 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(13)); }
#[test]
fn test_parenthesized_arithmetic() {
let code = r"(2 + 3) * (4 - 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(15)); }