package embeddings import ( "context" "math" "testing" "github.com/missionworkforce/missionmatch/internal/platform/config" ) func TestDeterministicIsStableAndCorrectDimension(t *testing.T) { e := NewDeterministic(384) if e.Dimension() != 384 { t.Fatalf("dim = %d, want 384", e.Dimension()) } a, _ := e.Embed(context.Background(), "Top Secret cleared Go developer") b, _ := e.Embed(context.Background(), "Top Secret cleared Go developer") if len(a) != 384 { t.Fatalf("len = %d, want 384", len(a)) } for i := range a { if a[i] != b[i] { t.Fatalf("not deterministic at %d: %v vs %v", i, a[i], b[i]) } } } func TestDeterministicVectorsAreNormalized(t *testing.T) { e := NewDeterministic(256) v, _ := e.Embed(context.Background(), "DISA cloud engineer") var ss float64 for _, f := range v { ss += float64(f) * float64(f) } if math.Abs(math.Sqrt(ss)-1.0) > 1e-4 { t.Fatalf("vector not unit-norm: |v| = %f", math.Sqrt(ss)) } } func TestDifferentTextDiffersAndCaseInsensitive(t *testing.T) { e := NewDeterministic(128) x, _ := e.Embed(context.Background(), "Kubernetes") y, _ := e.Embed(context.Background(), "Terraform") if equalVec(x, y) { t.Fatal("different text must produce different vectors") } // normalization of input: same text differing only by case/space is identical lower, _ := e.Embed(context.Background(), " kubernetes ") upper, _ := e.Embed(context.Background(), "Kubernetes") if !equalVec(lower, upper) { t.Fatal("case/space-normalized text must produce identical vectors") } } func TestEmbedBatchMatchesEmbed(t *testing.T) { e := NewDeterministic(64) texts := []string{"a", "b", "c"} batch, _ := e.EmbedBatch(context.Background(), texts) if len(batch) != 3 { t.Fatalf("batch len = %d, want 3", len(batch)) } for i, txt := range texts { one, _ := e.Embed(context.Background(), txt) if !equalVec(one, batch[i]) { t.Fatalf("batch[%d] != Embed(%q)", i, txt) } } } func TestNewSelectsProvider(t *testing.T) { fake, err := New(config.Embeddings{Provider: config.ProviderFake, Dimension: 384}) if err != nil || fake == nil { t.Fatalf("fake provider: %v", err) } if _, ok := fake.(deterministicEmbedder); !ok { t.Fatalf("fake provider should be deterministic, got %T", fake) } httpE, err := New(config.Embeddings{Provider: config.ProviderOpenAI, Endpoint: "http://x/v1/embeddings", Model: "m", Dimension: 384}) if err != nil || httpE == nil { t.Fatalf("openai provider: %v", err) } if _, err := New(config.Embeddings{Provider: config.ProviderBedrock, Dimension: 1024}); err == nil { t.Fatal("bedrock provider should report not-wired error in core build") } } func equalVec(a, b []float32) bool { if len(a) != len(b) { return false } for i := range a { if a[i] != b[i] { return false } } return true }