#![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_index_tuple_copy_type() {
let source = r#"
pub fn copy_first(path: Vec<(i32, i32)>) -> Vec<(i32, i32)> {
let mut rev = Vec::new()
rev.push(path[0])
rev
}
fn main() {
let path = vec![(1, 2), (3, 4)]
let rev = copy_first(path)
}
"#;
let (rust, compiles) = test_utils::compile_single_check(source);
assert!(
!rust.contains("&path[") && !rust.contains("& path["),
"Should NOT add & for Vec.push(Index) when element is Copy, got:\n{}",
rust
);
assert!(
!rust.contains("*(path[") && !rust.contains("* (path["),
"must not emit *(path[0]) for Copy tuple element. Got:\n{}",
rust
);
assert!(compiles, "Generated Rust must compile:\n{}", rust);
}
#[test]
fn test_vec_push_index_primitive_copy_type() {
let source = r#"
pub fn copy_evens(nums: Vec<i32>) -> Vec<i32> {
let mut buf = Vec::new()
let mut i = 0
while i < nums.len() {
let n = nums[i]
if n % 2 == 0 {
buf.push(n)
}
i = i + 1
}
buf
}
fn main() {
let nums = vec![1, 2, 3, 4]
let evens = copy_evens(nums)
}
"#;
let (rust, compiles) = test_utils::compile_single_check(source);
assert!(compiles, "Generated Rust must compile:\n{}", rust);
}
#[test]
fn test_vec_push_index_f32_param() {
let source = r#"
pub fn collect_floats(vals: Vec<f32>) -> Vec<f32> {
let mut out = Vec::new()
let mut i = 0
while i < vals.len() {
out.push(vals[i])
i = i + 1
}
out
}
fn main() {
let v: Vec<f32> = vec![1.0, 2.0, 3.0]
let _ = collect_floats(v)
}
"#;
let (rust, compiles) = test_utils::compile_single_check(source);
assert!(compiles, "Generated Rust must compile:\n{}", rust);
}