package recognition_test import ( "testing" "github.com/food-ai/backend/internal/adapters/ai" "github.com/food-ai/backend/internal/domain/recognition" ) func TestMergeAndDeduplicate_SingleBatch(t *testing.T) { batches := [][]ai.RecognizedItem{ { {Name: "apple", Quantity: 2, Unit: "pcs", Confidence: 0.9}, {Name: "banana", Quantity: 3, Unit: "pcs", Confidence: 0.8}, }, } result := recognition.MergeAndDeduplicate(batches) if len(result) != 2 { t.Fatalf("expected 2 items, got %d", len(result)) } } func TestMergeAndDeduplicate_Duplicate(t *testing.T) { batches := [][]ai.RecognizedItem{ {{Name: "apple", Quantity: 2, Unit: "pcs", Confidence: 0.7}}, {{Name: "apple", Quantity: 3, Unit: "pcs", Confidence: 0.8}}, } result := recognition.MergeAndDeduplicate(batches) if len(result) != 1 { t.Fatalf("expected 1 item after dedup, got %d", len(result)) } if result[0].Quantity != 5 { t.Errorf("expected quantity 5 (2+3), got %v", result[0].Quantity) } if result[0].Confidence != 0.8 { t.Errorf("expected confidence 0.8 (higher), got %v", result[0].Confidence) } } func TestMergeAndDeduplicate_CaseInsensitive(t *testing.T) { batches := [][]ai.RecognizedItem{ {{Name: "Apple", Quantity: 1, Unit: "pcs", Confidence: 0.9}}, {{Name: "apple", Quantity: 2, Unit: "pcs", Confidence: 0.7}}, } result := recognition.MergeAndDeduplicate(batches) if len(result) != 1 { t.Fatalf("expected 1 item (case-insensitive dedup), got %d", len(result)) } if result[0].Quantity != 3 { t.Errorf("expected quantity 3, got %v", result[0].Quantity) } } func TestMergeAndDeduplicate_KeepsHigherConfidence(t *testing.T) { batches := [][]ai.RecognizedItem{ {{Name: "milk", Quantity: 1, Unit: "L", Confidence: 0.5}}, {{Name: "milk", Quantity: 1, Unit: "L", Confidence: 0.95}}, } result := recognition.MergeAndDeduplicate(batches) if len(result) != 1 { t.Fatalf("expected 1 item, got %d", len(result)) } if result[0].Confidence != 0.95 { t.Errorf("expected confidence 0.95, got %v", result[0].Confidence) } } func TestMergeAndDeduplicate_Empty(t *testing.T) { result := recognition.MergeAndDeduplicate([][]ai.RecognizedItem{}) if len(result) != 0 { t.Errorf("expected empty result, got %d items", len(result)) } } func TestMergeAndDeduplicate_NilBatches(t *testing.T) { batches := [][]ai.RecognizedItem{nil, nil} result := recognition.MergeAndDeduplicate(batches) if len(result) != 0 { t.Errorf("expected empty result for nil batches, got %d items", len(result)) } }