#![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_vec_push_in_if_block_no_borrow() {
let source = r#"
pub fn collect_items() -> Vec<i32> {
let mut items: Vec<i32> = Vec::new()
if true {
items.push(1)
}
items
}
"#;
let (result, compiles) = test_utils::compile_single_check(source);
assert!(
compiles,
"Should compile. Generated:\n{}\n\nrustc error above",
result
);
assert!(
!result.contains("&mut items.push("),
"Should NOT add &mut to statement expression. Got:\n{}",
result
);
assert!(
result.contains("items.push(1") || result.contains("(&mut items).push(1)"),
"Should have valid push call. Got:\n{}",
result
);
}
#[test]
fn test_vec_push_in_match_arm_no_borrow() {
let source = r#"
pub fn process(x: i32) -> Vec<i32> {
let mut result: Vec<i32> = Vec::new()
match x {
0 => result.push(0),
1 => result.push(1),
_ => result.push(-1),
}
result
}
"#;
let (result, compiles) = test_utils::compile_single_check(source);
assert!(
compiles,
"Should compile. Generated:\n{}\n\nrustc error above",
result
);
assert!(
!result.contains("&mut result.push("),
"Should NOT add &mut to statement expression in match arm. Got:\n{}",
result
);
}
#[test]
fn test_vec_push_other_unit_methods_in_statement_position() {
let source = r#"
pub fn clear_vec() {
let mut v: Vec<i32> = Vec::new()
v.push(1)
v.clear()
}
"#;
let (result, compiles) = test_utils::compile_single_check(source);
assert!(
compiles,
"Should compile. Generated:\n{}\n\nrustc error above",
result
);
assert!(
!result.contains("&mut v.push("),
"Should NOT add &mut to v.push(). Got:\n{}",
result
);
assert!(
!result.contains("&mut v.clear("),
"Should NOT add &mut to v.clear(). Got:\n{}",
result
);
}