use ruchy::runtime::{Binding, Environment, Scope, Value};
use std::collections::HashMap;
use std::rc::Rc;
#[test]
fn test_environment_new() {
let _env = Environment::new();
assert!(true);
}
#[test]
fn test_environment_default() {
let _env = Environment::default();
assert!(true);
}
#[test]
fn test_environment_with_capacity() {
let _env = Environment::with_capacity(100);
assert!(true);
}
#[test]
fn test_binding_immutable() {
let binding = Binding {
value: Value::Integer(42),
mutable: false,
};
assert!(!binding.mutable);
assert_eq!(binding.value, Value::Integer(42));
}
#[test]
fn test_binding_mutable() {
let binding = Binding {
value: Value::String(Rc::new("hello".to_string())),
mutable: true,
};
assert!(binding.mutable);
}
#[test]
fn test_scope_new() {
let _scope = Scope::new();
assert!(true);
}
#[test]
fn test_scope_with_parent() {
let parent = Rc::new(Scope::new());
let _child = Scope::with_parent(parent);
assert!(true);
}
#[test]
fn test_define_and_lookup() {
let mut env = Environment::new();
env.define("x", Value::Integer(42), false);
let value = env.lookup("x");
assert!(value.is_some());
assert_eq!(value, Some(&Value::Integer(42)));
}
#[test]
fn test_define_mutable() {
let mut env = Environment::new();
env.define("mut_var", Value::Bool(true), true);
let value = env.lookup("mut_var");
assert_eq!(value, Some(&Value::Bool(true)));
}
#[test]
fn test_lookup_undefined() {
let env = Environment::new();
let value = env.lookup("undefined");
assert_eq!(value, None);
}
#[test]
fn test_set_mutable_binding() {
let mut env = Environment::new();
env.define("x", Value::Integer(1), true);
let result = env.set("x", Value::Integer(2));
assert!(result.is_ok());
let value = env.lookup("x");
assert_eq!(value, Some(&Value::Integer(2)));
}
#[test]
fn test_set_immutable_binding() {
let mut env = Environment::new();
env.define("x", Value::Integer(1), false);
let result = env.set("x", Value::Integer(2));
assert!(result.is_err());
}
#[test]
fn test_set_undefined_variable() {
let mut env = Environment::new();
let result = env.set("undefined", Value::Integer(42));
assert!(result.is_err());
}
#[test]
fn test_push_scope() {
let mut env = Environment::new();
env.define("x", Value::Integer(1), false);
env.push_scope();
env.define("x", Value::Integer(2), false);
let value = env.lookup("x");
assert_eq!(value, Some(&Value::Integer(2)));
}
#[test]
fn test_pop_scope() {
let mut env = Environment::new();
env.define("x", Value::Integer(1), false);
env.push_scope();
env.define("x", Value::Integer(2), false);
env.pop_scope();
let value = env.lookup("x");
assert_eq!(value, Some(&Value::Integer(1)));
}
#[test]
fn test_nested_scopes() {
let mut env = Environment::new();
env.define("x", Value::Integer(0), false);
for i in 1..=5 {
env.push_scope();
env.define("x", Value::Integer(i), false);
}
for i in (1..=5).rev() {
let value = env.lookup("x");
assert_eq!(value, Some(&Value::Integer(i)));
env.pop_scope();
}
let value = env.lookup("x");
assert_eq!(value, Some(&Value::Integer(0)));
}
#[test]
fn test_value_integer() {
let val = Value::Integer(42);
assert_eq!(val, Value::Integer(42));
}
#[test]
fn test_value_float() {
let val = Value::Float(3.14);
assert_eq!(val, Value::Float(3.14));
}
#[test]
fn test_value_string() {
let val = Value::String(Rc::new("hello".to_string()));
assert_eq!(val, Value::String(Rc::new("hello".to_string())));
}
#[test]
fn test_value_bool() {
let val = Value::Bool(true);
assert_eq!(val, Value::Bool(true));
}
#[test]
fn test_value_unit() {
let val = Value::Unit;
assert_eq!(val, Value::Unit);
}
#[test]
fn test_value_list() {
let list = vec![Value::Integer(1), Value::Integer(2), Value::Integer(3)];
let val = Value::List(Rc::new(list));
assert!(matches!(val, Value::List(_)));
}
#[test]
fn test_value_object() {
let mut map = HashMap::new();
map.insert("x".to_string(), Value::Integer(10));
map.insert("y".to_string(), Value::Integer(20));
let val = Value::Object(Rc::new(map));
assert!(matches!(val, Value::Object(_)));
}
#[test]
fn test_value_function() {
let func = |_args: Vec<Value>| -> Result<Value, String> { Ok(Value::Integer(42)) };
let val = Value::Function(Rc::new(func));
assert!(matches!(val, Value::Function(_)));
}
#[test]
fn test_value_equality() {
assert_eq!(Value::Integer(42), Value::Integer(42));
assert_ne!(Value::Integer(42), Value::Integer(43));
assert_ne!(Value::Integer(42), Value::String(Rc::new("42".to_string())));
}
#[test]
fn test_value_display() {
let val = Value::Integer(42);
let s = format!("{}", val);
assert!(s.contains("42"));
}
#[test]
fn test_multiple_bindings() {
let mut env = Environment::new();
for i in 0..100 {
env.define(&format!("var{}", i), Value::Integer(i), false);
}
for i in 0..100 {
let value = env.lookup(&format!("var{}", i));
assert_eq!(value, Some(&Value::Integer(i)));
}
}
#[test]
fn test_shadowing() {
let mut env = Environment::new();
env.define("x", Value::Integer(1), false);
env.define("x", Value::Integer(2), false);
let value = env.lookup("x");
assert_eq!(value, Some(&Value::Integer(2)));
}
#[test]
fn test_clear_environment() {
let mut env = Environment::new();
env.define("x", Value::Integer(42), false);
env.define("y", Value::String(Rc::new("hello".to_string())), false);
env.clear();
assert_eq!(env.lookup("x"), None);
assert_eq!(env.lookup("y"), None);
}
#[test]
fn test_deep_scope_nesting() {
let mut env = Environment::new();
for i in 0..1000 {
env.push_scope();
env.define("x", Value::Integer(i), false);
}
for _ in 0..1000 {
env.pop_scope();
}
assert!(true);
}
#[test]
fn test_many_environments() {
let mut envs = vec![];
for _ in 0..100 {
envs.push(Environment::new());
}
assert_eq!(envs.len(), 100);
}
#[test]
fn test_large_object() {
let mut map = HashMap::new();
for i in 0..1000 {
map.insert(format!("key{}", i), Value::Integer(i));
}
let val = Value::Object(Rc::new(map));
assert!(matches!(val, Value::Object(_)));
}
#[test]
fn test_scope_chain_lookup() {
let mut env = Environment::new();
env.define("global", Value::Integer(0), false);
env.push_scope();
env.define("level1", Value::Integer(1), false);
env.push_scope();
env.define("level2", Value::Integer(2), false);
assert_eq!(env.lookup("global"), Some(&Value::Integer(0)));
assert_eq!(env.lookup("level1"), Some(&Value::Integer(1)));
assert_eq!(env.lookup("level2"), Some(&Value::Integer(2)));
}
#[test]
fn test_closure_environment() {
let mut env = Environment::new();
env.define("captured", Value::Integer(42), false);
let closure = move |_args: Vec<Value>| -> Result<Value, String> {
Ok(Value::Integer(42))
};
let val = Value::Function(Rc::new(closure));
assert!(matches!(val, Value::Function(_)));
}