test(engine): red — NaN/Inf/zero embeddings pass validation

iss-embedding-nan-validation: validate_and_normalize_embedding checks
only dimension. The normalize guard (norm > f32::EPSILON) inverts on NaN
— normalization is skipped and the raw NaN vector returns Ok; an Inf
component normalizes to 0s + NaN; an all-zero vector (no direction,
undefined under cosine/ANN) passes. All were unpinned.

Fails as predicted against current code: unwrap_err() panics on the NaN
case — the poisoned vector is returned Ok.
This commit is contained in:
aaltshuler 2026-07-05 05:06:26 +03:00 committed by Andrew Altshuler
parent 281525cf7a
commit 3b00d81626

View file

@ -780,6 +780,24 @@ mod tests {
assert!(request.get("taskType").is_none());
}
#[test]
fn validate_and_normalize_embedding_rejects_non_finite_and_zero() {
// iss-embedding-nan-validation: a NaN component must be rejected —
// not silently returned un-normalized (NaN > EPSILON is false, so the
// normalize guard inverts and the raw NaN vector came back Ok).
let err = validate_and_normalize_embedding(vec![f32::NAN, 1.0], 2).unwrap_err();
assert!(err.contains("finite"), "NaN must be rejected, got: {err}");
// An Inf component must be rejected — not normalized into 0s + NaN.
let err = validate_and_normalize_embedding(vec![f32::INFINITY, 1.0], 2).unwrap_err();
assert!(err.contains("finite"), "Inf must be rejected, got: {err}");
let err =
validate_and_normalize_embedding(vec![1.0, f32::NEG_INFINITY], 2).unwrap_err();
assert!(err.contains("finite"), "-Inf must be rejected, got: {err}");
// An all-zero vector has no direction — undefined under cosine/ANN.
let err = validate_and_normalize_embedding(vec![0.0, 0.0], 2).unwrap_err();
assert!(err.contains("zero"), "zero vector must be rejected, got: {err}");
}
#[test]
fn validate_and_normalize_embedding_enforces_dimension() {
let normalized = validate_and_normalize_embedding(vec![3.0, 4.0], 2).unwrap();