| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package docs |
| |
| import ( |
| "slices" |
| "strings" |
| "testing" |
| |
| "golang.org/x/oscar/internal/storage" |
| "golang.org/x/oscar/internal/testutil" |
| ) |
| |
| func TestCorpus(t *testing.T) { |
| lg := testutil.Slogger(t) |
| db := storage.MemDB() |
| |
| corpus := New(lg, db) |
| corpus.Add("id1", "Title1", "text1") |
| corpus.Add("id3", "Title3", "text3") |
| corpus.Add("id2", "Title2", "text2") |
| |
| extra := make(map[string]string) |
| var ids []string |
| do := func(d *Doc) { |
| t.Helper() |
| if !strings.HasPrefix(d.ID, "id") { |
| t.Fatalf("invalid prefix %q", d.ID) |
| } |
| n := d.ID[len("id"):] |
| title := "Title" + n + extra[d.ID] |
| text := "text" + n + extra[d.ID] |
| if d.Title != title || d.Text != text { |
| t.Fatalf("Doc id=%s has Title=%q, Text=%q, want %q, %q", d.ID, d.Title, d.Text, title, text) |
| } |
| ids = append(ids, d.ID) |
| } |
| |
| // Basic iteration. |
| for d := range corpus.Docs("") { |
| do(d) |
| } |
| want := []string{"id1", "id2", "id3"} |
| if !slices.Equal(ids, want) { |
| t.Errorf("Docs() = %v, want %v", ids, want) |
| } |
| |
| // Break during iteration. |
| ids = nil |
| for d := range corpus.Docs("") { |
| do(d) |
| if d.ID == "id2" { |
| break |
| } |
| } |
| want = []string{"id1", "id2"} |
| if !slices.Equal(ids, want) { |
| t.Errorf("Docs with break = %v, want %v", ids, want) |
| } |
| |
| // DocsAfter iteration uses insert order. |
| var last *Doc |
| ids = nil |
| for d := range corpus.DocsAfter(0, "") { |
| do(d) |
| last = d |
| } |
| want = []string{"id1", "id3", "id2"} |
| if !slices.Equal(ids, want) { |
| t.Errorf("Docs() = %v, want %v", ids, want) |
| } |
| |
| // DocsAfter incremental iteration. |
| corpus.Add("id4", "Title4", "text4") |
| extra["id2"] = "X" |
| corpus.Add("id2", "Title2X", "text2X") // edits existing text |
| corpus.Add("id3", "Title3", "text3") // no-op, ignored |
| ids = nil |
| for d := range corpus.DocsAfter(last.DBTime, "") { |
| do(d) |
| } |
| want = []string{"id4", "id2"} |
| if !slices.Equal(ids, want) { |
| t.Errorf("DocsAfter(last.DBTime=%d) = %v, want %v", last.DBTime, ids, want) |
| } |
| |
| // DocsAfter with break. |
| ids = nil |
| for d := range corpus.DocsAfter(last.DBTime, "") { |
| do(d) |
| break |
| } |
| want = []string{"id4"} |
| if !slices.Equal(ids, want) { |
| t.Errorf("DocsAfter(last.DBTime=%d) with break = %v, want %v", last.DBTime, ids, want) |
| } |
| |
| // Docs with prefix. |
| corpus.Add("id11", "Title11", "text11") |
| ids = nil |
| for d := range corpus.Docs("id1") { |
| do(d) |
| } |
| want = []string{"id1", "id11"} |
| if !slices.Equal(ids, want) { |
| t.Errorf("Docs(id1) = %v, want %v", ids, want) |
| } |
| |
| // DocsAfter with prefix. |
| ids = nil |
| for d := range corpus.DocsAfter(0, "id1") { |
| do(d) |
| } |
| want = []string{"id1", "id11"} |
| if !slices.Equal(ids, want) { |
| t.Errorf("DocsAfter(0, id1) = %v, want %v", ids, want) |
| } |
| } |