use crate::runtime::Value;
pub struct ConservativeGC {
}
impl Default for ConservativeGC {
fn default() -> Self {
Self::new()
}
}
impl ConservativeGC {
pub fn new() -> Self {
Self {}
}
pub fn collect(&mut self) {
}
pub fn track(&mut self, _value: &Value) {
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::Arc;
#[test]
fn test_gc_new() {
let _gc = ConservativeGC::new();
}
#[test]
fn test_gc_default() {
let _gc = ConservativeGC::default();
}
#[test]
fn test_gc_collect() {
let mut gc = ConservativeGC::new();
gc.collect();
}
#[test]
fn test_gc_track_value() {
let mut gc = ConservativeGC::new();
let value = Value::Integer(42);
gc.track(&value);
}
#[test]
fn test_gc_track_multiple_values() {
let mut gc = ConservativeGC::new();
let values = vec![
Value::Integer(1),
Value::Float(2.0),
Value::Bool(true),
Value::from_string("test".to_string()),
Value::Nil,
];
for value in &values {
gc.track(value);
}
}
#[test]
fn test_gc_collect_after_tracking() {
let mut gc = ConservativeGC::new();
gc.track(&Value::Integer(100));
gc.track(&Value::from_string("tracked".to_string()));
gc.collect();
}
#[test]
fn test_gc_multiple_collect_cycles() {
let mut gc = ConservativeGC::new();
for i in 0..10 {
gc.track(&Value::Integer(i));
if i % 3 == 0 {
gc.collect();
}
}
}
#[test]
fn test_gc_track_complex_values() {
let mut gc = ConservativeGC::new();
gc.track(&Value::Array(Arc::from(vec![
Value::Integer(1),
Value::Integer(2),
])));
let mut obj = std::collections::HashMap::new();
obj.insert("key".to_string(), Value::from_string("value".to_string()));
gc.track(&Value::Object(Arc::new(obj)));
gc.collect();
}
#[test]
fn test_gc_track_nil() {
let mut gc = ConservativeGC::new();
gc.track(&Value::Nil);
}
#[test]
fn test_gc_track_range() {
let mut gc = ConservativeGC::new();
let range = Value::Range {
start: Box::new(Value::Integer(0)),
end: Box::new(Value::Integer(10)),
inclusive: false,
};
gc.track(&range);
}
#[test]
fn test_gc_track_tuple() {
let mut gc = ConservativeGC::new();
let tuple = Value::Tuple(Arc::from(vec![Value::Integer(1), Value::Integer(2)]));
gc.track(&tuple);
}
#[test]
fn test_gc_track_byte() {
let mut gc = ConservativeGC::new();
gc.track(&Value::Byte(42));
gc.track(&Value::Byte(255));
gc.track(&Value::Byte(0));
}
#[test]
fn test_gc_track_atom() {
let mut gc = ConservativeGC::new();
gc.track(&Value::Atom("ok".to_string()));
gc.track(&Value::Atom("error".to_string()));
}
#[test]
fn test_gc_track_enum_variant() {
let mut gc = ConservativeGC::new();
let variant = Value::EnumVariant {
enum_name: "Option".to_string(),
variant_name: "Some".to_string(),
data: Some(vec![Value::Integer(42)]),
};
gc.track(&variant);
}
#[test]
fn test_gc_track_deeply_nested_array() {
let mut gc = ConservativeGC::new();
let inner = Value::Array(Arc::from(vec![Value::Integer(1)]));
let middle = Value::Array(Arc::from(vec![inner.clone(), inner.clone()]));
let outer = Value::Array(Arc::from(vec![middle.clone(), middle]));
gc.track(&outer);
}
#[test]
fn test_gc_track_large_object() {
let mut gc = ConservativeGC::new();
let mut obj = std::collections::HashMap::new();
for i in 0..100 {
obj.insert(format!("key_{i}"), Value::Integer(i));
}
gc.track(&Value::Object(Arc::new(obj)));
}
#[test]
fn test_gc_collect_multiple_times() {
let mut gc = ConservativeGC::new();
for _ in 0..100 {
gc.collect();
}
}
#[test]
fn test_gc_track_and_collect_interleaved() {
let mut gc = ConservativeGC::new();
for i in 0..50 {
gc.track(&Value::Integer(i));
if i % 5 == 0 {
gc.collect();
}
}
}
#[test]
fn test_gc_track_closure() {
let mut gc = ConservativeGC::new();
let closure = Value::Closure {
params: vec![("x".to_string(), None), ("y".to_string(), None)],
body: Arc::from(crate::frontend::ast::Expr::new(
crate::frontend::ast::ExprKind::Literal(crate::frontend::ast::Literal::Integer(
0, None,
)),
Default::default(),
)),
env: std::rc::Rc::new(std::cell::RefCell::new(std::collections::HashMap::new())),
};
gc.track(&closure);
}
#[test]
fn test_gc_track_native_function() {
let mut gc = ConservativeGC::new();
gc.track(&Value::Atom("native_func".to_string()));
}
#[test]
fn test_gc_new_multiple_instances() {
let gc1 = ConservativeGC::new();
let gc2 = ConservativeGC::new();
let gc3 = ConservativeGC::default();
drop(gc1);
drop(gc2);
drop(gc3);
}
#[test]
fn test_gc_track_mixed_types_sequence() {
let mut gc = ConservativeGC::new();
gc.track(&Value::Integer(1));
gc.track(&Value::Float(1.5));
gc.track(&Value::Bool(true));
gc.track(&Value::from_string("test".to_string()));
gc.track(&Value::Nil);
gc.track(&Value::Byte(42));
gc.collect();
gc.track(&Value::Integer(2));
gc.collect();
}
#[test]
fn test_gc_track_empty_containers() {
let mut gc = ConservativeGC::new();
gc.track(&Value::Array(Arc::from(vec![])));
gc.track(&Value::Tuple(Arc::from(vec![])));
gc.track(&Value::Object(Arc::new(std::collections::HashMap::new())));
}
}