From 5d40b4047a6a98d03f063146678f274c70214551 Mon Sep 17 00:00:00 2001 From: jess Date: Thu, 28 May 2026 04:33:49 -0700 Subject: [PATCH] fix array bug with string concat in display --- core/src/interp.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/core/src/interp.rs b/core/src/interp.rs index 4787442..231cd50 100644 --- a/core/src/interp.rs +++ b/core/src/interp.rs @@ -2366,6 +2366,23 @@ impl Interpreter { (Op::Add, Value::Number(a), Value::Str(b)) => Ok(Value::Str(format!("{}{}", format_number(*a), b))), (Op::Add, Value::Str(a), Value::Bool(b)) => Ok(Value::Str(format!("{}{}", a, b))), (Op::Add, Value::Bool(a), Value::Str(b)) => Ok(Value::Str(format!("{}{}", a, b))), + (Op::Add, Value::Str(s), other) => Ok(Value::Str(format!("{}{}", s, other.display()))), + (Op::Add, other, Value::Str(s)) => Ok(Value::Str(format!("{}{}", other.display(), s))), + (Op::Add, Value::Array(a), Value::Array(b)) => { + let mut out = a.clone(); + out.extend(b.iter().cloned()); + Ok(Value::Array(out)) + } + (Op::Add, Value::Array(a), other) => { + let mut out = a.clone(); + out.push(other.clone()); + Ok(Value::Array(out)) + } + (Op::Add, other, Value::Array(a)) => { + let mut out = vec![other.clone()]; + out.extend(a.iter().cloned()); + Ok(Value::Array(out)) + } (Op::Lt, Value::Number(a), Value::Number(b)) => Ok(Value::Bool(a < b)), (Op::Gt, Value::Number(a), Value::Number(b)) => Ok(Value::Bool(a > b)), @@ -6164,6 +6181,56 @@ fn find(arr, target) { assert!(matches!(v, Value::Number(n) if n == 3.0)); } + #[test] + fn add_str_plus_array_stringifies() { + let mut i = Interpreter::new(); + let v = i.eval_expr_str(r#""Diff: " + [1, 2]"#).unwrap(); + match v { + Value::Str(s) => assert_eq!(s, "Diff: [1, 2]"), + _ => panic!("expected Str, got {:?}", v), + } + } + + #[test] + fn add_array_plus_str_stringifies() { + let mut i = Interpreter::new(); + let v = i.eval_expr_str(r#"[1, 2] + " items""#).unwrap(); + match v { + Value::Str(s) => assert_eq!(s, "[1, 2] items"), + _ => panic!(), + } + } + + #[test] + fn add_array_plus_array_concats() { + let mut i = Interpreter::new(); + let v = i.eval_expr_str("[1, 2] + [3, 4]").unwrap(); + match v { + Value::Array(a) => assert_eq!(a.len(), 4), + _ => panic!(), + } + } + + #[test] + fn add_array_plus_number_appends() { + let mut i = Interpreter::new(); + let v = i.eval_expr_str("[1, 2] + 3").unwrap(); + match v { + Value::Array(a) => assert_eq!(a.len(), 3), + _ => panic!(), + } + } + + #[test] + fn add_chains_str_array_str() { + let mut i = Interpreter::new(); + let v = i.eval_expr_str(r#""Diff: " + [10, 20] + " + Sum: " + [30, 40]"#).unwrap(); + match v { + Value::Str(s) => assert_eq!(s, "Diff: [10, 20] + Sum: [30, 40]"), + _ => panic!(), + } + } + #[test] fn rand_unit_range() { let mut i = Interpreter::new();