#![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_macro_with_f32_annotation() {
let source = r#"
fn test() {
let v: Vec<f32> = vec![1.0, 2.0, 3.0]
}
"#;
let output = test_utils::compile_single(source);
assert!(
output.contains("1.0_f32") && output.contains("2.0_f32") && output.contains("3.0_f32"),
"Vec<f32> = vec![1.0, 2.0, 3.0] should generate _f32, got:\n{}",
output
);
assert!(
!output.contains("1.0_f64") && !output.contains("2.0_f64") && !output.contains("3.0_f64"),
"Should not have f64 when Vec<f32> is annotated, got:\n{}",
output
);
}
#[test]
fn test_array_literal_with_f32_annotation() {
let source = r#"
fn test() {
let a: [f32; 3] = [1.0, 2.0, 3.0]
}
"#;
let output = test_utils::compile_single(source);
assert!(
output.contains("1.0_f32") && output.contains("2.0_f32") && output.contains("3.0_f32"),
"[f32; 3] = [1.0, 2.0, 3.0] should generate _f32, got:\n{}",
output
);
}
#[test]
fn test_array_repeat_with_f32_annotation() {
let source = r#"
fn test() {
let a: [f32; 10] = [1.0; 10]
}
"#;
let output = test_utils::compile_single(source);
assert!(
output.contains("1.0_f32"),
"[f32; 10] = [1.0; 10] should generate 1.0_f32, got:\n{}",
output
);
}
#[test]
fn test_nested_vec_vec_f32() {
let source = r#"
fn test() {
let v: Vec<Vec<f32>> = vec![vec![1.0, 2.0], vec![3.0, 4.0]]
}
"#;
let output = test_utils::compile_single(source);
assert!(
output.contains("1.0_f32")
&& output.contains("2.0_f32")
&& output.contains("3.0_f32")
&& output.contains("4.0_f32"),
"Vec<Vec<f32>> nested vec! should generate _f32 for all literals, got:\n{}",
output
);
}
#[test]
fn test_no_annotation_defaults_to_f32() {
let source = r#"
fn test() {
let v = vec![1.0, 2.0]
}
"#;
let output = test_utils::compile_single(source);
assert!(
output.contains("1.0_f32") && output.contains("2.0_f32"),
"Unannotated vec![1.0, 2.0] should default to f32 (Windjammer convention), got:\n{}",
output
);
}
#[test]
fn test_vec_f64_explicit() {
let source = r#"
fn test() {
let v: Vec<f64> = vec![1.0, 2.0, 3.0]
}
"#;
let output = test_utils::compile_single(source);
assert!(
output.contains("1.0_f64") && output.contains("2.0_f64") && output.contains("3.0_f64"),
"Vec<f64> = vec![1.0, 2.0, 3.0] should generate _f64, got:\n{}",
output
);
}
#[test]
fn test_array_f64_annotation() {
let source = r#"
fn test() {
let a: [f64; 3] = [1.0, 2.0, 3.0]
}
"#;
let output = test_utils::compile_single(source);
assert!(
output.contains("1.0_f64") && output.contains("2.0_f64") && output.contains("3.0_f64"),
"[f64; 3] = [1.0, 2.0, 3.0] should generate _f64, got:\n{}",
output
);
}
#[test]
fn test_vec_repeat_with_f32() {
let source = r#"
fn test() {
let v: Vec<f32> = vec![1.0; 5]
}
"#;
let output = test_utils::compile_single(source);
assert!(
output.contains("1.0_f32"),
"Vec<f32> = vec![1.0; 5] should generate 1.0_f32, got:\n{}",
output
);
}