#![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]
fn test_option_pattern_if_let_borrows_self_field() {
let source = r#"
pub struct ItemStack {
pub item: ItemStats,
}
pub struct ItemStats {
pub health: i32,
pub damage: i32,
pub name: string,
}
pub struct Equipment {
pub weapon: Option<ItemStack>,
}
impl Equipment {
pub fn get_total_damage(self) -> i32 {
let mut total = 0
if let Some(stack) = self.weapon {
total = total + stack.item.damage
}
total
}
}
"#;
let rust_code = match test_utils::compile_single_result(source) {
Ok(code) => code,
Err(e) => panic!("Compilation failed: {}", e),
};
assert!(
rust_code.contains("&self.weapon"),
"Option pattern on self field should use &self.weapon when &self. Got:\n{}",
rust_code
);
}
#[test]
fn test_option_map_uses_as_ref_for_self_field() {
let source = r#"
pub struct OctreeNode {
pub value: u8,
pub children: Option<Vec<OctreeNode>>,
}
impl OctreeNode {
pub fn child_count(self) -> i32 {
self.children.map(|c| c.len() as i32).unwrap_or(0)
}
}
"#;
let rust_code = match test_utils::compile_single_result(source) {
Ok(code) => code,
Err(e) => panic!("Compilation failed: {}", e),
};
assert!(
rust_code.contains(".as_ref().map("),
"Option::map on self field should use .as_ref().map() when &self. Got:\n{}",
rust_code
);
}
#[test]
fn test_get_mut_infers_mut_self() {
let source = r#"
use std::collections::HashMap
pub struct SceneNode {
pub id: u64,
pub children: Vec<u64>,
}
pub struct SceneGraph {
pub nodes: HashMap<u64, SceneNode>,
}
impl SceneGraph {
pub fn attach_child(self, parent_id: u64, child_id: u64) {
if self.nodes.contains_key(parent_id) {
let mut parent = self.nodes.get_mut(parent_id).unwrap()
if !parent.children.contains(child_id) {
parent.children.push(child_id)
}
}
}
}
"#;
let rust_code = match test_utils::compile_single_result(source) {
Ok(code) => code,
Err(e) => panic!("Compilation failed: {}", e),
};
assert!(
rust_code.contains("fn attach_child(&mut self"),
"Method calling get_mut on self field should infer &mut self. Got:\n{}",
rust_code
);
}