package topk import ( "fmt" "math/rand" "sort" "testing" ) func TestTopK(t *testing.T) { stream := New(10) ss := []*Stream{New(10), New(10), New(10)} m := make(map[string]int) for _, s := range ss { for i := 0; i < 1e6; i++ { v := fmt.Sprintf("%x", int8(rand.ExpFloat64())) s.Insert(v) m[v]++ } stream.Merge(s.Query()) } var sm Samples for x, s := range m { sm = append(sm, &Element{x, s}) } sort.Sort(sort.Reverse(sm)) g := stream.Query() if len(g) != 10 { t.Fatalf("got %d, want 10", len(g)) } for i, e := range g { if sm[i].Value != e.Value { t.Errorf("at %d: want %q, got %q", i, sm[i].Value, e.Value) } } } func TestQuery(t *testing.T) { queryTests := []struct { value string expected int }{ {"a", 1}, {"b", 2}, {"c", 2}, } stream := New(2) for _, tt := range queryTests { stream.Insert(tt.value) if n := len(stream.Query()); n != tt.expected { t.Errorf("want %d, got %d", tt.expected, n) } } }