Repository navigation
Expand file tree
/
Copy pathengine_test.go
More file actions
121 lines (105 loc) · 2.9 KB
/
Copy pathengine_test.go
File metadata and controls
121 lines (105 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package tinysearch
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"io/ioutil"
"log"
"os"
"reflect"
"strings"
"testing"
)
var testDB *sql.DB
func setup() *sql.DB {
db, err := sql.Open("mysql", "root@tcp(127.0.0.1:3306)/tinysearch")
if err != nil {
log.Fatal(err)
}
_, err = db.Exec(`TRUNCATE TABLE documents`)
if err != nil {
log.Fatal(err)
}
if err := os.RemoveAll("_index_data"); err != nil {
log.Fatal(err)
}
if err := os.Mkdir("_index_data", 0777); err != nil {
log.Fatal(err)
}
return db
}
func TestMain(m *testing.M) {
testDB = setup()
defer testDB.Close()
exitCode := m.Run()
os.Exit(exitCode)
}
// インデックス構築処理のテスト
func TestCreateIndex(t *testing.T) {
engine := NewSearchEngine(testDB) // ❶ 検索エンジンを初期化する
type testDoc struct {
title string
body string
}
docs := []testDoc{
{"test1", "Do you quarrel, sir?"},
{"test2", "No better."},
{"test3", "Quarrel sir! no, sir!"},
}
for _, doc := range docs {
// ❷ インデックスにドキュメントを追加する
r := strings.NewReader(doc.body)
if err := engine.AddDocument(doc.title, r); err != nil {
t.Fatalf("failed to add document %s: %v", doc.title, err)
}
}
// ❸ インデックスをファイルに書き出して永続化
if err := engine.Flush(); err != nil {
t.Fatalf("failed to save index to file :%v", err)
}
type testCase struct {
file string
postingsStr string
}
testCases := []testCase{
{"_index_data/_0.dc", "3"},
{"_index_data/better", `[{"DocID":2,"Positions":[1],"TermFrequency":1}]`},
{"_index_data/no", `[{"DocID":2,"Positions":[0],"TermFrequency":1},{"DocID":3,"Positions":[2],"TermFrequency":1}]`},
{"_index_data/do", `[{"DocID":1,"Positions":[0],"TermFrequency":1}]`},
{"_index_data/quarrel", `[{"DocID":1,"Positions":[2],"TermFrequency":1},{"DocID":3,"Positions":[0],"TermFrequency":1}]`},
{"_index_data/sir", `[{"DocID":1,"Positions":[3],"TermFrequency":1},{"DocID":3,"Positions":[1,3],"TermFrequency":2}]`},
{"_index_data/you", `[{"DocID":1,"Positions":[1],"TermFrequency":1}]`},
}
for _, testCase := range testCases {
func() {
file, err := os.Open(testCase.file)
if err != nil {
t.Fatalf("failed to load index: %v", err)
}
defer file.Close()
bytes, err := ioutil.ReadAll(file)
if err != nil {
t.Fatalf("failed to load index: %v", err)
}
got := string(bytes)
want := testCase.postingsStr
if got != want {
t.Errorf("got : %v\nwant: %v\n", got, want)
}
}()
}
}
func TestSearch(t *testing.T) {
engine := NewSearchEngine(testDB)
query := "Quarrel, sir."
actual, err := engine.Search(query, 5)
if err != nil {
t.Fatalf("failed SearchTopK: %v", err)
}
expected := []*SearchResult{
{3, 1.754887502163469, "test3"},
{1, 1.1699250014423126, "test1"},
}
for !reflect.DeepEqual(actual, expected) {
t.Fatalf("\ngot:\n%v\nwant:\n%v\n", actual, expected)
}
}