using ZB.MOM.WW.CBDD.Core.Indexing;
namespace ZB.MOM.WW.CBDD.Tests;
public class VectorMathTests
{
///
/// Verifies distance calculations across all supported vector metrics.
///
[Fact]
public void Distance_Should_Cover_All_Metrics()
{
float[] v1 = [1f, 2f];
float[] v2 = [3f, 4f];
var cosineDistance = VectorMath.Distance(v1, v2, VectorMetric.Cosine);
var l2Distance = VectorMath.Distance(v1, v2, VectorMetric.L2);
var dotDistance = VectorMath.Distance(v1, v2, VectorMetric.DotProduct);
l2Distance.ShouldBe(8f);
dotDistance.ShouldBe(-11f);
var expectedCosine = 1f - (11f / (MathF.Sqrt(5f) * 5f));
MathF.Abs(cosineDistance - expectedCosine).ShouldBeLessThan(0.0001f);
}
///
/// Verifies cosine similarity returns zero when one vector has zero magnitude.
///
[Fact]
public void CosineSimilarity_Should_Return_Zero_For_ZeroMagnitude_Vector()
{
float[] v1 = [0f, 0f, 0f];
float[] v2 = [1f, 2f, 3f];
VectorMath.CosineSimilarity(v1, v2).ShouldBe(0f);
}
///
/// Verifies dot product throws for mismatched vector lengths.
///
[Fact]
public void DotProduct_Should_Throw_For_Length_Mismatch()
{
float[] v1 = [1f, 2f];
float[] v2 = [1f];
Should.Throw(() => VectorMath.DotProduct(v1, v2));
}
///
/// Verifies squared Euclidean distance throws for mismatched vector lengths.
///
[Fact]
public void EuclideanDistanceSquared_Should_Throw_For_Length_Mismatch()
{
float[] v1 = [1f, 2f, 3f];
float[] v2 = [1f, 2f];
Should.Throw(() => VectorMath.EuclideanDistanceSquared(v1, v2));
}
}