use super::*;
#[test]
fn test_solve_type_variable() {
let mut ctx = InferenceContext::new();
let expr = parse_code("42");
ctx.infer(&expr).expect("should infer");
let var = TyVar(0);
let solved = ctx.solve(&var);
assert!(matches!(solved, MonoType::Var(_)) || matches!(solved, MonoType::Int));
}
#[test]
fn test_apply_substitution() {
let ctx = InferenceContext::new();
let ty = MonoType::Int;
let applied = ctx.apply(&ty);
assert!(matches!(applied, MonoType::Int));
}
#[test]
fn test_apply_substitution_string() {
let ctx = InferenceContext::new();
let ty = MonoType::String;
let applied = ctx.apply(&ty);
assert!(matches!(applied, MonoType::String));
}
#[test]
fn test_infer_if_let() {
let mut ctx = InferenceContext::new();
let expr = parse_code("if let Some(x) = Some(42) { x } else { 0 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_while_let() {
let mut ctx = InferenceContext::new();
let expr = parse_code("while let Some(x) = Some(1) { break }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_struct_definition() {
let mut ctx = InferenceContext::new();
let expr = parse_code("struct Point { x: Int, y: Int }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_enum_definition() {
let mut ctx = InferenceContext::new();
let expr = parse_code("enum Option { Some(Int), None }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_slice() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2, 3, 4][1..3]");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_object_literal() {
let mut ctx = InferenceContext::new();
let expr = parse_code("{ x: 1, y: 2 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_pipeline() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2, 3] |> len");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_actor_send() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1 + 2");
let result = ctx.infer(&expr);
assert!(result.is_ok());
}
#[test]
fn test_infer_trait_definition() {
let mut ctx = InferenceContext::new();
let expr = parse_code("trait Show { fun show() }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_impl_block() {
let mut ctx = InferenceContext::new();
let expr = parse_code("impl Show for Point { fun show() { \"point\" } }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_try_expression() {
let mut ctx = InferenceContext::new();
let expr = parse_code("try { Ok(42) } catch (e) { Err(e) }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_inference_context_default() {
let ctx = InferenceContext::new();
drop(ctx);
}
#[test]
fn test_infer_match_with_tuple_pattern() {
let mut ctx = InferenceContext::new();
let expr = parse_code("match (1, 2) { (a, b) => a + b, _ => 0 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_match_with_list_pattern() {
let mut ctx = InferenceContext::new();
let expr = parse_code("match [1, 2, 3] { [a, b, c] => a, _ => 0 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_match_with_or_pattern() {
let mut ctx = InferenceContext::new();
let expr = parse_code("match 1 { 1 | 2 | 3 => true, _ => false }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_match_with_range_pattern() {
let mut ctx = InferenceContext::new();
let expr = parse_code("match 5 { 1..10 => true, _ => false }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_float_addition() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1.5 + 2.5");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Float | MonoType::Int));
}
}
#[test]
fn test_infer_float_multiplication() {
let mut ctx = InferenceContext::new();
let expr = parse_code("2.0 * 3.0");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Float | MonoType::Int));
}
}
#[test]
fn test_infer_generic_method() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2, 3].unknown_method()");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Var(_) | MonoType::Int));
}
}
#[test]
fn test_infer_import() {
let mut ctx = InferenceContext::new();
let expr = parse_code("import { foo } from \"module\"");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_export() {
let mut ctx = InferenceContext::new();
let expr = parse_code("export { foo }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_break_with_value() {
let mut ctx = InferenceContext::new();
let expr = parse_code("break 42");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(
ty,
MonoType::Unit | MonoType::Int | MonoType::Var(_)
));
}
}
#[test]
fn test_infer_return_no_value() {
let mut ctx = InferenceContext::new();
let expr = parse_code("return");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Unit | MonoType::Var(_)));
}
}
#[test]
fn test_infer_context_new_r122() {
let ctx = InferenceContext::new();
drop(ctx); }
#[test]
fn test_infer_if_true_branch() {
let mut ctx = InferenceContext::new();
let expr = parse_code("if true { 42 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_while_loop_false_r122() {
let mut ctx = InferenceContext::new();
let expr = parse_code("while false { 1 }");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Unit | MonoType::Var(_)));
}
}
#[test]
fn test_infer_for_loop_simple() {
let mut ctx = InferenceContext::new();
let expr = parse_code("for i in [1, 2, 3] { i }");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Unit | MonoType::Var(_)));
}
}
#[test]
fn test_infer_lambda_simple() {
let mut ctx = InferenceContext::new();
let expr = parse_code("|x| x + 1");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_method_call_len() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2, 3].len()");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_struct_definition_point_r122() {
let mut ctx = InferenceContext::new();
let expr = parse_code("struct Point { x: int, y: int }");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Unit | MonoType::Var(_)));
}
}
#[test]
fn test_infer_enum_definition_color_r122() {
let mut ctx = InferenceContext::new();
let expr = parse_code("enum Color { Red, Green, Blue }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_range_inclusive() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1..=10");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_range_exclusive() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1..10");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_tuple_two_elements_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("(1, 2)");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_tuple_mixed_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("(1, \"hello\", true)");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_array_empty_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[]");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_array_single_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[42]");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_nested_if_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("if true { if false { 1 } else { 2 } } else { 3 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_let_chain_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("let x = 1\nlet y = 2\nx + y");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_function_call_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("foo(1, 2, 3)");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_method_chain_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2].push(3).pop()");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_binary_comparison_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1 < 2");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_binary_equality_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1 == 1");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_binary_logical_and_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("true && false");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_binary_logical_or_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("true || false");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_unary_not_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("!true");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_unary_negate_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("-42");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_index_access_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2, 3][0]");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_object_literal_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("{ x: 1, y: 2 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_field_access_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("obj.field");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_return_with_value_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("return 42");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_break_simple_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("break");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_continue_r124() {
let mut ctx = InferenceContext::new();
let expr = parse_code("continue");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_float_literal_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("3.14159");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Float | MonoType::Var(_)));
}
}
#[test]
fn test_infer_negative_float_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("-2.5");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_string_literal_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code(r#""hello world""#);
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::String | MonoType::Var(_)));
}
}
#[test]
fn test_infer_empty_string_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code(r#""""#);
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::String | MonoType::Var(_)));
}
}
#[test]
fn test_infer_bool_true_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("true");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_bool_false_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("false");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_nil_literal_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("nil");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_addition_int_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("10 + 20");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_subtraction_int_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("100 - 50");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_multiplication_int_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("5 * 7");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_division_int_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("20 / 4");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_modulo_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("17 % 5");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_less_than_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1 < 2");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_greater_than_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("5 > 3");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_less_equal_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("3 <= 3");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_greater_equal_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("5 >= 5");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_not_equal_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1 != 2");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_empty_array_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[]");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_int_array_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2, 3]");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_string_array_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code(r#"["a", "b", "c"]"#);
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_nested_array_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[[1, 2], [3, 4]]");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_empty_tuple_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("()");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_pair_tuple_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("(1, 2)");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_mixed_tuple_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code(r#"(1, "two", 3.0)"#);
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_simple_lambda_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("|x| x");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_lambda_with_body_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("|x| x + 1");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_multi_param_lambda_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("|x, y| x + y");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_if_simple_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("if true { 1 } else { 2 }");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_if_no_else_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("if true { 1 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_if_else_if_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("if true { 1 } else if false { 2 } else { 3 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_block_single_expr_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("{ 42 }");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_block_multiple_stmts_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("{ let x = 1; let y = 2; x + y }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_let_int_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("let x = 42");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_let_string_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code(r#"let s = "hello""#);
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_let_with_type_annotation_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("let x: Int = 42");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_function_no_params_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("fun foo() { 42 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_function_one_param_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("fun double(x) { x * 2 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_function_two_params_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("fun add(a, b) { a + b }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_function_with_return_type_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("fun answer() -> Int { 42 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_call_no_args_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("foo()");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_call_one_arg_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("print(42)");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_call_multiple_args_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("add(1, 2, 3)");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_while_loop_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("while true { 1 }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_for_loop_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("for x in [1, 2, 3] { x }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_range_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("0..10");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_range_inclusive_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("0..=10");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_match_simple_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("match x { 1 => true, _ => false }");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_pipe_operator_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("1 |> double");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_method_call_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2, 3].len()");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_chained_method_call_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("[1, 2, 3].map(|x| x * 2).filter(|x| x > 2)");
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_string_interpolation_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code(r#"f"hello {name}""#);
let result = ctx.infer(&expr);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_infer_complex_arithmetic_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("(1 + 2) * (3 - 4) / 5");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}
#[test]
fn test_infer_complex_logical_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("(true && false) || (true && !false)");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Bool | MonoType::Var(_)));
}
}
#[test]
fn test_infer_deeply_nested_r163() {
let mut ctx = InferenceContext::new();
let expr = parse_code("((((1 + 2) + 3) + 4) + 5)");
let result = ctx.infer(&expr);
if let Ok(ty) = result {
assert!(matches!(ty, MonoType::Int | MonoType::Var(_)));
}
}