Skip to content

Commit 6a9dddf

Browse files
committed
✨ test: update arithmetic operator tests and error handling for mixed types
1 parent f0f8f84 commit 6a9dddf

File tree

4 files changed

+21
-61
lines changed

4 files changed

+21
-61
lines changed

crates/mq-check/src/builtin.rs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,26 +1034,21 @@ mod tests {
10341034
}
10351035

10361036
#[rstest]
1037-
#[case::add_numbers("1 + 2", true)]
1038-
#[case::add_strings("\"hello\" + \"world\"", true)]
1039-
#[case::add_string_number("\"value: \" + 42", true)] // String + number coercion
1040-
#[case::add_arrays("[1, 2] + [3, 4]", true)] // Array concatenation
1041-
#[case::add_mixed("1 + \"world\"", false)] // Should fail: type mismatch
1042-
#[case::sub("10 - 5", true)]
1043-
#[case::mul("3 * 4", true)]
1044-
#[case::mul_array_repeat("[1, 2] * 3", true)] // Array repetition
1045-
#[case::div("10 / 2", true)]
1046-
#[case::mod_op("10 % 3", true)]
1047-
#[case::pow("2 ^ 8", true)]
1048-
fn test_arithmetic_operators(#[case] code: &str, #[case] should_succeed: bool) {
1037+
#[case::add_numbers("1 + 2")]
1038+
#[case::add_number_string("1 + \"string\"")]
1039+
#[case::add_strings("\"hello\" + \"world\"")]
1040+
#[case::add_string_number("\"value: \" + 42")] // String + number coercion
1041+
#[case::add_arrays("[1, 2] + [3, 4]")] // Array concatenation
1042+
#[case::add_mixed("1 + \"world\"")] // Should fail: type mismatch
1043+
#[case::sub("10 - 5")]
1044+
#[case::mul("3 * 4")]
1045+
#[case::mul_array_repeat("[1, 2] * 3")] // Array repetition
1046+
#[case::div("10 / 2")]
1047+
#[case::mod_op("10 % 3")]
1048+
#[case::pow("2 ^ 8")]
1049+
fn test_arithmetic_operators(#[case] code: &str) {
10491050
let result = check_types(code);
1050-
assert_eq!(
1051-
result.is_empty(),
1052-
should_succeed,
1053-
"Code: {}\nResult: {:?}",
1054-
code,
1055-
result
1056-
);
1051+
assert!(result.is_empty(), "Code: {}\nResult: {:?}", code, result);
10571052
}
10581053

10591054
#[rstest]
@@ -1408,7 +1403,6 @@ mod tests {
14081403

14091404
// Type Error Cases
14101405
#[rstest]
1411-
#[case::add_number_string("1 + \"string\"", false)] // number + string is invalid
14121406
#[case::add_bool_number("true + 1", false)] // bool + number is invalid
14131407
#[case::add_bool_string("true + \"s\"", false)] // bool + string is invalid
14141408
#[case::sub_strings("\"a\" - \"b\"", false)] // strings cannot be subtracted

crates/mq-check/tests/error_location_test.rs

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -39,37 +39,3 @@ fn test_homogeneous_array_no_error() {
3939
let errors = check_types(code);
4040
assert!(errors.is_empty(), "Homogeneous array should have no errors");
4141
}
42-
43-
#[test]
44-
fn test_binary_op_type_error_location() {
45-
let code = r#"1 + "hello""#;
46-
let errors = check_types(code);
47-
48-
assert!(!errors.is_empty(), "Expected type error for number + string");
49-
}
50-
51-
#[test]
52-
fn test_error_message_readability() {
53-
// Test that error messages are human-readable
54-
let code = r#"1 + "hello""#;
55-
let errors = check_types(code);
56-
57-
assert!(!errors.is_empty(), "Expected type error");
58-
59-
let error_msg = format!("{}", errors[0]);
60-
// The error message should be informative
61-
assert!(
62-
error_msg.contains("mismatch") || error_msg.contains("type") || error_msg.contains("unify"),
63-
"Error message should mention type mismatch: {}",
64-
error_msg
65-
);
66-
}
67-
68-
#[test]
69-
fn test_multiple_errors_show_locations() {
70-
// Code with type error in binary operation
71-
let code = r#"1 + "two""#;
72-
let errors = check_types(code);
73-
74-
assert!(!errors.is_empty(), "Expected at least one type error");
75-
}

crates/mq-check/tests/integration_test.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ fn test_try_catch() {
333333
#[rstest]
334334
#[case::add_strings(r#"def add(x, y): x + y; | add("hello", "world")"#, true)]
335335
#[case::add_numbers("def add(x, y): x + y; | add(1, 2)", true)]
336-
#[case::add_mixed_types(r#"def add(x, y): x + y; | add(1, "hello")"#, false)]
336+
#[case::add_mixed_types(r#"def add(x, y): x + y; | add(1, "hello")"#, true)]
337337
#[case::add_mixed_types_reversed(r#"def add(x, y): x + y; | add("hello", 1)"#, true)] // string+any->string overload matches
338338
#[case::string_concat_in_fn(r#"def greet(name): "hello " + name; | greet("world")"#, true)]
339339
#[case::unary_negation("-42", true)]
@@ -415,8 +415,8 @@ fn test_macro_with_multiple_params() {
415415
// User-Defined Function Type Checking
416416

417417
#[rstest]
418-
#[case::arg_type_mismatch(r#"def add(x, y): x + y; | add(1, "hello")"#, false)]
419-
#[case::return_type_propagation(r#"def get_num(): 42; | get_num() + "hello""#, false)]
418+
#[case::arg_type_mismatch(r#"def add(x, y): x + y; | add(1, "hello")"#, true)]
419+
#[case::return_type_propagation(r#"def get_num(): 42; | get_num() + "hello""#, true)]
420420
#[case::chained_calls(r#"def double(x): x + x; | def negate(x): 0 - x; | double(negate(1))"#, true)]
421421
#[case::string_plus_number(r#"def greet(): "hello"; | greet() + 1"#, true)]
422422
#[case::string_minus_number(r#"def greet(): "hello"; | greet() - 1"#, false)]
@@ -447,7 +447,7 @@ fn test_user_function_type_checking(#[case] code: &str, #[case] should_succeed:
447447
#[case::number_mul_string(r#"3 * "x""#, false, "number * string")]
448448
#[case::string_minus_number(r#""abc" - 1"#, false, "string - number")]
449449
#[case::string_div_number(r#""abc" / 2"#, false, "string / number")]
450-
#[case::number_add_string(r#"1 + "world""#, false, "number + string")]
450+
#[case::number_add_string(r#"1 + "world""#, true, "number + string")]
451451
#[case::string_mul_string(r#""a" * "b""#, false, "string * string")]
452452
#[case::string_div_string(r#""a" / "b""#, false, "string / string")]
453453
#[case::string_minus_string(r#""a" - "b""#, false, "string - string")]
@@ -524,7 +524,7 @@ fn test_equality_op_type_errors(#[case] code: &str, #[case] should_succeed: bool
524524
#[case::let_num_minus_string(r#"let x = 1 | x - "str""#, false, "let number binding minus string")]
525525
#[case::let_num_mul_string(r#"let x = 1 | x * "str""#, false, "let number binding times string")]
526526
#[case::let_num_div_string(r#"let x = 1 | x / "str""#, false, "let number binding div string")]
527-
#[case::let_num_plus_string(r#"let x = 1 | x + "str""#, false, "let number binding plus string")]
527+
#[case::let_num_plus_string(r#"let x = 1 | x + "str""#, true, "let number binding plus string")]
528528
#[case::let_string_minus_num(r#"let x = "hello" | x - 1"#, false, "let string binding minus number")]
529529
#[case::let_string_div_num(r#"let x = "hello" | x / 2"#, false, "let string binding div number")]
530530
#[case::let_string_mul_string(r#"let x = "hello" | x * "world""#, false, "let string binding times string")]

crates/mq-check/tests/type_errors_test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ fn check_types(code: &str) -> Vec<TypeError> {
2222

2323
#[test]
2424
fn test_binary_op_type_mismatch() {
25-
let result = check_types(r#"1 + "string""#);
25+
let result = check_types(r#"1 + true"#);
2626
println!("Binary op type mismatch: {:?}", result);
27-
assert!(!result.is_empty(), "Expected type error for number + string");
27+
assert!(!result.is_empty(), "Expected type error for number + boolean");
2828
}
2929

3030
#[test]

0 commit comments

Comments
 (0)