use super::*; use crate::mir::ValueId; #[test] fn test_boundary_inputs_only() { let boundary = JoinInlineBoundary::new_inputs_only( vec![ValueId(0)], // JoinIR uses ValueId(0) for loop var vec![ValueId(4)], // Host has loop var at ValueId(4) ); assert_eq!(boundary.join_inputs.len(), 1); assert_eq!(boundary.host_inputs.len(), 1); assert_eq!(boundary.loop_invariants.len(), 0); assert_eq!(boundary.exit_bindings.len(), 0); assert_eq!(boundary.condition_bindings.len(), 0); } #[test] #[should_panic(expected = "join_inputs and host_inputs must have same length")] fn test_boundary_mismatched_inputs() { JoinInlineBoundary::new_inputs_only(vec![ValueId(0), ValueId(1)], vec![ValueId(4)]); } #[test] fn test_jump_args_layout_rejects_expr_result_carrier_mismatch() { let boundary = JoinInlineBoundary { join_inputs: vec![], host_inputs: vec![], loop_invariants: vec![], exit_bindings: vec![LoopExitBinding { carrier_name: "result".to_string(), join_exit_value: ValueId(10), host_slot: ValueId(1), role: crate::mir::join_ir::lowering::carrier_info::CarrierRole::LoopState, }], condition_bindings: vec![], expr_result: Some(ValueId(10)), jump_args_layout: JumpArgsLayout::ExprResultPlusCarriers, loop_var_name: None, loop_header_func_name: None, carrier_info: None, continuation_func_ids: JoinInlineBoundary::default_continuations(), exit_reconnect_mode: crate::mir::join_ir::lowering::carrier_info::ExitReconnectMode::default(), }; let err = boundary .validate_jump_args_layout() .expect_err("layout mismatch must fail-fast"); assert!(err.contains("jump_args_layout_mismatch")); }