#[cfg(test)]
mod tests {
use super::*;
use approx::assert_relative_eq;
#[test]
fn test_simd_vector_add_empty_input() {
let input: Vec<f64> = vec![];
let result = simd_vector_add(&input, 5.0);
assert_eq!(result.len(), 0);
}
#[test]
fn test_simd_vector_add_single_element() {
let input = vec![2.0];
let result = simd_vector_add(&input, 3.0);
assert_relative_eq!(result[0], 5.0);
}
#[test]
fn test_simd_vector_add_exact_simd_chunk() {
let input = vec![1.0, 2.0, 3.0, 4.0];
let result = simd_vector_add(&input, 10.0);
let expected = vec![11.0, 12.0, 13.0, 14.0];
for (r, e) in result.iter().zip(expected.iter()) {
assert_relative_eq!(r, e);
}
}
#[test]
fn test_simd_vector_add_with_remainder() {
let input = vec![1.0, 2.0, 3.0, 4.0, 5.0];
let result = simd_vector_add(&input, 10.0);
let expected = vec![11.0, 12.0, 13.0, 14.0, 15.0];
for (r, e) in result.iter().zip(expected.iter()) {
assert_relative_eq!(r, e);
}
}
#[test]
fn test_simd_vector_add_large_input() {
let size = 101;
let input: Vec<f64> = (0..size).map(|x| x as f64).collect();
let value = 10.5;
let result = simd_vector_add(&input, value);
for (i, x) in result.iter().enumerate() {
assert_relative_eq!(*x, i as f64 + value);
}
}
#[test]
fn test_simd_vector_add_zero_value() {
let input = vec![1.0, 2.0, 3.0, 4.0, 5.0];
let result = simd_vector_add(&input, 0.0);
let expected = input.clone();
for (r, e) in result.iter().zip(expected.iter()) {
assert_relative_eq!(r, e);
}
}
#[test]
fn test_simd_vector_add_negative_value() {
let input = vec![1.0, 2.0, 3.0, 4.0];
let result = simd_vector_add(&input, -2.0);
let expected = vec![-1.0, 0.0, 1.0, 2.0];
for (r, e) in result.iter().zip(expected.iter()) {
assert_relative_eq!(r, e);
}
}
#[test]
fn test_simd_vector_add_extreme_values() {
let input = vec![f64::MAX, f64::MIN, f64::EPSILON];
let value = 1.0;
let result = simd_vector_add(&input, value);
assert_relative_eq!(result[0], f64::MAX + 1.0);
assert_relative_eq!(result[1], f64::MIN + 1.0);
assert_relative_eq!(result[2], f64::EPSILON + 1.0);
}
}