#![cfg(any(
not(any(
feature = "parser_tests",
feature = "analyzer_tests",
feature = "codegen_tests",
feature = "interpreter_tests",
feature = "conformance_tests",
feature = "integration_tests",
)),
feature = "analyzer_tests",
))]
#[path = "common/test_utils.rs"]
mod test_utils;
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_hashmap_remove_adds_ref() {
let code = r#"
use std::collections::HashMap
pub fn remove_item(mut map: HashMap<string, int>, key: string) -> Option<int> {
return map.remove(key)
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("map.remove(key)") || generated.contains("map.remove(&key)"),
"Should handle HashMap::remove key correctly. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_hashmap_get_adds_ref() {
let code = r#"
use std::collections::HashMap
pub fn get_value(map: HashMap<string, int>, key: string) -> Option<int> {
return map.get(key)
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("map.get(key)") || generated.contains("map.get(&key)"),
"Should handle HashMap::get key correctly. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_string_contains_adds_ref() {
let code = r#"
pub fn has_substring(text: string, search: string) -> bool {
return text.contains(search)
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("text.contains(&search)")
|| generated.contains("text.contains(search.as_str())")
|| generated.contains("text.contains(search)"),
"String::contains should work with borrowed or owned search. Generated:\n{}",
generated
);
let code_owned = r#"
pub fn has_substring_owned(text: string, search: string) -> string {
let found = text.contains(search)
return search
}
"#;
let generated_owned =
test_utils::compile_single_result(code_owned).expect("Compilation failed");
assert!(
generated_owned.contains("text.contains(&search)")
|| generated_owned.contains("text.contains(search.as_str())")
|| generated_owned.contains("text.contains(&search.clone())")
|| generated_owned.contains("text.contains(&text)"),
"When search is owned String, should auto-add & for String::contains. Generated:\n{}",
generated_owned
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_vec_remove_no_ref() {
let code = r#"
pub fn remove_at(mut items: Vec<int>, index: usize) -> int {
return items.remove(index)
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("items.remove(index)") && !generated.contains("items.remove(&index)"),
"Should NOT add & for Vec::remove (Copy type). Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_vec_contains_adds_ref() {
let code = r#"
pub fn has_item(items: Vec<string>, search: string) -> string {
let found = items.contains(search)
return search
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("items.contains(&search)")
|| generated.contains("items.contains(search)")
|| generated.contains("items.contains(&search.clone())"),
"Should auto-add & for Vec::contains (or handle borrowed search). Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_string_literal_no_ref() {
let code = r#"
pub fn check_text(text: string) -> bool {
return text.contains("hello")
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("text.contains(\"hello\")")
&& !generated.contains("text.contains(&\"hello\")"),
"Should NOT add & to string literals. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_mixed_owned_and_literal() {
let code = r#"
use std::collections::HashMap
pub fn test(mut map: HashMap<string, int>, key: string) -> bool {
map.insert(key, 42);
return map.contains_key("test")
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
(generated.contains("map.insert(key, 42)")
|| generated.contains("map.insert(key, 42_i32)")
|| generated.contains("map.insert(key, 42_i64)"))
&& !generated.contains("map.insert(&key"),
"insert should not add & to owned key. Generated:\n{}",
generated
);
assert!(
generated.contains("map.contains_key(\"test\")")
&& !generated.contains("contains_key(&\"test\")"),
"contains_key should not add & to literals. Generated:\n{}",
generated
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_custom_method_with_ref_param() {
let code = r#"
pub struct Validator {
}
impl Validator {
pub fn check(self, pattern: string) -> bool {
return pattern.len() > 0
}
}
pub fn test(validator: Validator, text: string) -> bool {
return validator.check(text)
}
"#;
let generated = test_utils::compile_single_result(code).expect("Compilation failed");
assert!(
generated.contains("validator.check(&text)")
|| generated.contains("validator.check(text.as_str())")
|| generated.contains("validator.check(text)"),
"Custom method check should work with borrowed or owned text. Generated:\n{}",
generated
);
let code_owned = r#"
pub struct Validator {
}
impl Validator {
pub fn check(self, pattern: string) -> bool {
return pattern.len() > 0
}
}
pub fn test_owned(validator: Validator, text: string) -> string {
let valid = validator.check(text)
return text
}
"#;
let generated_owned =
test_utils::compile_single_result(code_owned).expect("Compilation failed");
assert!(
generated_owned.contains("validator.check(&text)")
|| generated_owned.contains("validator.check(text.as_str())")
|| generated_owned.contains("validator.check(&text)"),
"When text is owned String, should auto-add & for custom methods. Generated:\n{}",
generated_owned
);
}