#![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_get_with_borrowed_key_from_keys() {
let code = r#"
use std::collections::HashMap
pub fn get_values(map: HashMap<string, i32>) -> Vec<i32> {
let mut result = Vec::new()
for key in map.keys() {
let value = map.get(key)
match value {
Some(v) => result.push(*v),
None => {}
}
}
result
}
"#;
let (generated, success) = test_utils::compile_single_check(code);
let err = if !success { &generated } else { "" };
println!("Generated:\n{}", generated);
if !success {
println!("Rustc error:\n{}", err);
}
assert!(
!generated.contains("map.get(&key)"),
"Generated code should not double-reference key: map.get(&key) is wrong"
);
assert!(
generated.contains("map.get(key)"),
"Generated code should use single reference: map.get(key)"
);
assert!(
success,
"Generated Rust code should compile successfully. Rustc error:\n{}",
err
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_hashmap_get_with_owned_key() {
let code = r#"
use std::collections::HashMap
pub fn lookup(map: HashMap<string, i32>, key: string) -> Option<i32> {
match map.get(key) {
Some(v) => Some(*v),
None => None
}
}
"#;
let (generated, success) = test_utils::compile_single_check(code);
let err = if !success { &generated } else { "" };
println!("Generated:\n{}", generated);
if !success {
println!("Rustc error:\n{}", err);
}
assert!(
generated.contains("map.get(&key)") || generated.contains("map.get(key)"),
"Generated code should handle owned String key correctly"
);
assert!(
success,
"Generated Rust code should compile successfully. Rustc error:\n{}",
err
);
}
#[test]
#[cfg_attr(tarpaulin, ignore)]
fn test_hashmap_get_with_explicit_borrowed_key() {
let code = r#"
use std::collections::HashMap
pub fn lookup_borrowed(map: HashMap<string, i32>, key: string) -> Option<i32> {
match map.get(key) {
Some(v) => Some(*v),
None => None
}
}
"#;
let (generated, success) = test_utils::compile_single_check(code);
let err = if !success { &generated } else { "" };
println!("Generated:\n{}", generated);
if !success {
println!("Rustc error:\n{}", err);
}
assert!(
generated.contains("key: &str"),
"Read-only string param should infer &str. Got:\n{}",
generated
);
assert!(
generated.contains("map.get(&key)") || generated.contains("map.get(key)"),
"HashMap.get should accept inferred &str key. Got:\n{}",
generated
);
assert!(
success,
"Generated Rust code should compile successfully. Rustc error:\n{}",
err
);
}