#[cfg(test)] mod array_state_sharing_tests { use nyash_rust::interpreter::NyashInterpreter; use nyash_rust::parser::NyashParser; use nyash_rust::boxes::array::ArrayBox; use nyash_rust::box_trait::{NyashBox, IntegerBox, StringBox}; #[test] fn test_arraybox_state_sharing_bug_fix() { // ๐Ÿšจ ๅ•้กŒๅ†็พใƒ†ใ‚นใƒˆ let mut interpreter = NyashInterpreter::new(); let program = r#" static box Main { init { result } main() { local arr arr = new ArrayBox() arr.push("hello") me.result = arr.length() return me.result } } "#; let ast = NyashParser::parse_from_string(program).unwrap(); let result = interpreter.execute(ast).unwrap(); let int_result = result.as_any().downcast_ref::().unwrap(); assert_eq!(int_result.value, 1); // ๐ŸŽฏ 0ใงใฏใชใ1ใ‚’่ฟ”ใ™ในใ } #[test] fn test_share_box_vs_clone_box_semantics() { let arr1 = ArrayBox::new(); arr1.push(Box::new(StringBox::new("hello"))); // share_box: ็Šถๆ…‹ๅ…ฑๆœ‰ let arr2 = arr1.share_box(); let arr2_array = arr2.as_any().downcast_ref::().unwrap(); assert_eq!(arr2_array.len(), 1); // ๅ…ฑๆœ‰ใ•ใ‚Œใฆใ„ใ‚‹ // clone_box: ็‹ฌ็ซ‹ let arr3 = arr1.clone_box(); let arr3_array = arr3.as_any().downcast_ref::().unwrap(); arr1.push(Box::new(StringBox::new("world"))); assert_eq!(arr3_array.len(), 1); // ๅฝฑ้Ÿฟใ‚’ๅ—ใ‘ใชใ„ assert_eq!(arr1.len(), 2); // ๅ…ƒใฏ2่ฆ็ด  assert_eq!(arr2_array.len(), 2); // ๅ…ฑๆœ‰ใ•ใ‚Œใฆใ„ใ‚‹ใฎใง2่ฆ็ด  } #[test] fn test_multiple_operations_state_preservation() { let mut interpreter = NyashInterpreter::new(); let program = r#" static box Main { init { result } main() { local arr arr = new ArrayBox() arr.push("first") arr.push("second") arr.push("third") me.result = arr.length() return me.result } } "#; let ast = NyashParser::parse_from_string(program).unwrap(); let result = interpreter.execute(ast).unwrap(); let int_result = result.as_any().downcast_ref::().unwrap(); assert_eq!(int_result.value, 3); // 3่ฆ็ด ใŒๆญฃใ—ใไฟๆŒใ•ใ‚Œใ‚‹ในใ } }