#[path = "support/mod.rs"]
mod test_helpers;
use runmat_builtins::Value;
use runmat_parser::parse;
use test_helpers::execute;
use test_helpers::lower;
#[test]
fn chained_member_and_index_assignments() {
let src = "__register_test_classes(); o = new_object('OverIdx'); try; o(1)=42; catch e; end; o.k = 7; z = o.k;";
let hir = lower(&parse(src).unwrap()).unwrap();
let vars = execute(&hir).unwrap();
assert!(vars
.iter()
.any(|v| matches!(v, runmat_builtins::Value::Num(n) if (*n - 7.0).abs() < 1e-9)));
}
#[test]
fn deep_chain_with_try_catch() {
let src = "__register_test_classes(); o = new_object('OverIdx'); try; o(1).f{1}=3; catch e; ok=1; end;";
let hir = lower(&parse(src).unwrap()).unwrap();
let vars = execute(&hir).unwrap();
assert!(vars
.iter()
.any(|v| matches!(v, runmat_builtins::Value::Num(n) if (*n - 1.0).abs() < 1e-9)));
}
#[test]
fn brace_get_and_set_on_object() {
let src = "__register_test_classes(); o = new_object('OverIdx'); o{1} = 5; r = o{1};";
let hir = lower(&parse(src).unwrap()).unwrap();
let vars = execute(&hir).unwrap();
assert!(vars
.iter()
.any(|v| matches!(v, runmat_builtins::Value::Num(n) if (*n - 5.0).abs() < 1e-9)));
}
#[test]
fn colon_slice_and_broadcast_assign() {
let src = "A=[1,2;3,4]; y = A(:,2); A(:,2)=[9;8]; C=A; A(1,:)=[7,6]; D=A;";
let hir = lower(&parse(src).unwrap()).unwrap();
let vars = execute(&hir).unwrap();
assert!(vars
.iter()
.any(|v| matches!(v, runmat_builtins::Value::Tensor(t) if t.data == vec![2.0,4.0])));
assert!(vars.iter().any(
|v| matches!(v, runmat_builtins::Value::Tensor(t) if t.data == vec![1.0,3.0,9.0,8.0])
));
assert!(vars.iter().any(
|v| matches!(v, runmat_builtins::Value::Tensor(t) if t.data == vec![7.0,3.0,6.0,8.0])
));
}
#[test]
fn logical_mask_indexing_chain() {
let src = "A=[1,2;3,4]; mask=[true false]; B=A(:,mask);";
let hir = lower(&parse(src).unwrap()).unwrap();
let vars = execute(&hir).unwrap();
assert!(vars
.iter()
.any(|v| matches!(v, runmat_builtins::Value::Tensor(t) if t.data == vec![1.0,3.0])));
}
#[test]
fn broadcast_row_assign() {
let src = "A=[1,2;3,4]; A(:,2)=5; B=A;";
let hir = lower(&parse(src).unwrap()).unwrap();
let vars = execute(&hir).unwrap();
if let runmat_builtins::Value::Tensor(b) = &vars[1] {
assert_eq!(b.data, vec![1.0, 3.0, 5.0, 5.0]);
} else {
panic!("B not tensor");
}
}
#[test]
fn assign_scalar_element() {
let ast = parse("A=[1,2;3,4]; A(2,1)=42; B=A").unwrap();
let hir = lower(&ast).unwrap();
let vars = execute(&hir).unwrap();
if let Value::Tensor(b) = &vars[1] {
assert_eq!(b.data, vec![1.0, 42.0, 2.0, 4.0]);
} else {
panic!("B not tensor");
}
}
#[test]
fn assign_full_column() {
let ast = parse("A=[1,2;3,4]; A(:,2)=[9;8]; B=A").unwrap();
let hir = lower(&ast).unwrap();
let vars = execute(&hir).unwrap();
if let Value::Tensor(b) = &vars[1] {
assert_eq!(b.data, vec![1.0, 3.0, 9.0, 8.0]);
} else {
panic!("B not tensor");
}
}
#[test]
fn assign_full_row() {
let ast = parse("A=[1,2;3,4]; A(1,:)=[7,6]; B=A").unwrap();
let hir = lower(&ast).unwrap();
let vars = execute(&hir).unwrap();
if let Value::Tensor(b) = &vars[1] {
assert_eq!(b.data, vec![7.0, 3.0, 6.0, 4.0]);
} else {
panic!("B not tensor");
}
}