83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
package recommend
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestContextAffinityPrefersTypicalWeekdayTime(t *testing.T) {
|
|
location := time.FixedZone("test", 12*60*60)
|
|
profile := NewContextAffinityProfile()
|
|
comedy := Item{Genres: []string{"Comedy"}}
|
|
drama := Item{Genres: []string{"Drama"}}
|
|
for i := 0; i < 6; i++ {
|
|
profile.Add(
|
|
comedy,
|
|
time.Date(2026, 7, 6+i*7, 19, 30, 0, 0, location),
|
|
1,
|
|
i,
|
|
location,
|
|
)
|
|
profile.Add(
|
|
drama,
|
|
time.Date(2026, 7, 7+i*7, 13, 0, 0, 0, location),
|
|
1,
|
|
i,
|
|
location,
|
|
)
|
|
}
|
|
|
|
now := time.Date(2026, 7, 27, 20, 0, 0, 0, location) // Monday evening.
|
|
comedyScore, confidence := profile.Score(comedy, now, location)
|
|
dramaScore, _ := profile.Score(drama, now, location)
|
|
if comedyScore <= dramaScore {
|
|
t.Fatalf("Monday-evening comedy score %.3f <= drama score %.3f", comedyScore, dramaScore)
|
|
}
|
|
if confidence != 1 {
|
|
t.Fatalf("confidence = %.3f, want 1 after repeated matching sessions", confidence)
|
|
}
|
|
}
|
|
|
|
func TestContextAffinityUsesNeighboringWindowsAsWeakFallback(t *testing.T) {
|
|
location := time.UTC
|
|
profile := NewContextAffinityProfile()
|
|
item := Item{Genres: []string{"Documentary"}}
|
|
profile.Add(
|
|
item,
|
|
time.Date(2026, 7, 20, 16, 30, 0, 0, location), // Monday afternoon.
|
|
0.8,
|
|
0,
|
|
location,
|
|
)
|
|
|
|
exact, exactConfidence := profile.Score(
|
|
item, time.Date(2026, 7, 27, 16, 0, 0, 0, location), location,
|
|
)
|
|
neighbor, neighborConfidence := profile.Score(
|
|
item, time.Date(2026, 7, 27, 18, 0, 0, 0, location), location,
|
|
)
|
|
if neighbor <= 0 || neighbor*neighborConfidence >= exact*exactConfidence {
|
|
t.Fatalf(
|
|
"weighted neighbor %.3f should be positive and below exact %.3f",
|
|
neighbor*neighborConfidence,
|
|
exact*exactConfidence,
|
|
)
|
|
}
|
|
if neighborConfidence >= exactConfidence {
|
|
t.Fatalf(
|
|
"neighbor confidence %.3f should be below exact %.3f",
|
|
neighborConfidence,
|
|
exactConfidence,
|
|
)
|
|
}
|
|
}
|
|
|
|
func TestContextAffinityHasNeutralSparseHistoryFallback(t *testing.T) {
|
|
score, confidence := (ContextAffinityProfile{}).Score(
|
|
Item{Genres: []string{"Drama"}}, time.Now(), time.UTC,
|
|
)
|
|
if score != 0 || confidence != 0 {
|
|
t.Fatalf("empty profile = score %.3f confidence %.3f, want neutral", score, confidence)
|
|
}
|
|
}
|