#[cfg(test)] mod array_state_sharing_tests { use crate::interpreter::Interpreter; use crate::boxes::array::ArrayBox; use crate::box_trait::{NyashBox, IntegerBox, StringBox}; #[test] fn test_arraybox_state_sharing_bug_fix() { // ๐Ÿšจ ๅ•้กŒๅ†็พใƒ†ใ‚นใƒˆ let mut interpreter = Interpreter::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 result = interpreter.execute_program(program).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 = Interpreter::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 result = interpreter.execute_program(program).unwrap(); let int_result = result.as_any().downcast_ref::().unwrap(); assert_eq!(int_result.value, 3); // 3่ฆ็ด ใŒๆญฃใ—ใไฟๆŒใ•ใ‚Œใ‚‹ในใ } }