use crate::value::PerlValue;
use parking_lot::RwLock;
use std::sync::Arc;
#[test]
fn test_perl_value_truthiness() {
assert!(!PerlValue::UNDEF.is_true());
assert!(PerlValue::integer(1).is_true());
assert!(!PerlValue::integer(0).is_true());
assert!(PerlValue::integer(-1).is_true());
assert!(PerlValue::string("true".into()).is_true());
assert!(PerlValue::string("1".into()).is_true());
assert!(!PerlValue::string("0".into()).is_true());
assert!(!PerlValue::string("".into()).is_true());
assert!(PerlValue::string("00".into()).is_true());
assert!(PerlValue::string("0.0".into()).is_true());
assert!(PerlValue::float(1.0).is_true());
assert!(PerlValue::float(0.1).is_true());
assert!(!PerlValue::float(0.0).is_true());
assert!(!PerlValue::float(-0.0).is_true());
}
#[test]
fn test_numeric_conversions() {
assert_eq!(PerlValue::string("42".into()).to_int(), 42);
assert_eq!(PerlValue::string("42.5".into()).to_int(), 42);
assert_eq!(PerlValue::string(" 42 ".into()).to_int(), 42);
assert_eq!(PerlValue::string("42abc".into()).to_int(), 42);
assert_eq!(PerlValue::string("abc42".into()).to_int(), 0);
assert_eq!(PerlValue::float(42.9).to_int(), 42);
assert_eq!(PerlValue::float(-42.9).to_int(), -42);
assert_eq!(PerlValue::UNDEF.to_int(), 0);
}
#[test]
fn test_string_conversions() {
assert_eq!(PerlValue::integer(42).to_string(), "42");
assert_eq!(PerlValue::float(42.5).to_string(), "42.5");
assert_eq!(PerlValue::UNDEF.to_string(), "");
assert_eq!(PerlValue::float(42.0).to_string(), "42");
}
#[test]
fn test_cloning_semantics() {
let v1 = PerlValue::array(vec![PerlValue::integer(10)]);
let _v2 = v1.clone();
if let Some(mut arr) = v1.as_array_vec() {
arr[0] = PerlValue::integer(20);
assert_eq!(arr[0].to_int(), 20);
}
if let Some(arr) = v1.as_array_vec() {
assert_eq!(arr[0].to_int(), 10);
}
}
#[test]
fn test_comparison_logic() {
let ten = PerlValue::integer(10);
let two_str = PerlValue::string("2".into());
assert!(ten.to_number() > two_str.to_number());
assert!(ten.to_string() < two_str.to_string());
}
#[test]
fn test_deep_copy_on_clone() {
let arr = vec![PerlValue::integer(1)];
let v1 = PerlValue::array(arr);
let v2 = v1.clone();
assert_ne!(v1.0, v2.0);
assert_eq!(v1.to_string(), v2.to_string());
}
#[test]
fn test_shallow_clone_shares_ptr() {
let v1 = PerlValue::array(vec![PerlValue::integer(1)]);
let v2 = v1.shallow_clone();
assert_eq!(v1.0, v2.0); }
#[test]
fn test_array_ref_shares_on_clone() {
let shared_vec = Arc::new(RwLock::new(vec![PerlValue::integer(1)]));
let v1 = PerlValue::array_ref(shared_vec);
let v2 = v1.clone();
assert_eq!(v1.0, v2.0); }
#[test]
fn test_nested_cloning() {
let inner = PerlValue::array(vec![PerlValue::integer(1)]);
let outer = PerlValue::array(vec![inner]);
let cloned = outer.clone();
assert_ne!(outer.0, cloned.0);
let outer_arr = outer.as_array_vec().unwrap();
let cloned_arr = cloned.as_array_vec().unwrap();
assert_ne!(outer_arr[0].0, cloned_arr[0].0);
}
#[test]
fn test_hash_cloning() {
let mut map = indexmap::IndexMap::new();
map.insert("key".to_string(), PerlValue::integer(1));
let h1 = PerlValue::hash(map);
let h2 = h1.clone();
assert_ne!(h1.0, h2.0);
if let Some(m1) = h1.as_hash_map() {
assert_eq!(m1.get("key").unwrap().to_int(), 1);
}
}