|
|
|
@ -1,9 +1,12 @@
|
|
|
|
|
package search
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"math/rand"
|
|
|
|
|
"strings"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/tal-tech/go-zero/core/stringx"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type mockedRoute struct {
|
|
|
|
@ -139,11 +142,9 @@ func TestStrictSearchSibling(t *testing.T) {
|
|
|
|
|
tree.Add(r.route, r.value)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i := 0; i < 1000; i++ {
|
|
|
|
|
result, ok := tree.Search(query)
|
|
|
|
|
assert.True(t, ok)
|
|
|
|
|
assert.Equal(t, 3, result.Item.(int))
|
|
|
|
|
}
|
|
|
|
|
result, ok := tree.Search(query)
|
|
|
|
|
assert.True(t, ok)
|
|
|
|
|
assert.Equal(t, 3, result.Item.(int))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAddDuplicate(t *testing.T) {
|
|
|
|
@ -185,3 +186,41 @@ func TestSearchInvalidItem(t *testing.T) {
|
|
|
|
|
err := tree.Add("/", nil)
|
|
|
|
|
assert.Equal(t, errEmptyItem, err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkSearchTree(b *testing.B) {
|
|
|
|
|
const (
|
|
|
|
|
avgLen = 1000
|
|
|
|
|
entries = 10000
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
tree := NewTree()
|
|
|
|
|
generate := func() string {
|
|
|
|
|
var buf strings.Builder
|
|
|
|
|
size := rand.Intn(avgLen) + avgLen/2
|
|
|
|
|
val := stringx.Randn(size)
|
|
|
|
|
prev := 0
|
|
|
|
|
for j := rand.Intn(9) + 1; j < size; j += rand.Intn(9) + 1 {
|
|
|
|
|
buf.WriteRune('/')
|
|
|
|
|
buf.WriteString(val[prev:j])
|
|
|
|
|
prev = j
|
|
|
|
|
}
|
|
|
|
|
if prev < size {
|
|
|
|
|
buf.WriteRune('/')
|
|
|
|
|
buf.WriteString(val[prev:])
|
|
|
|
|
}
|
|
|
|
|
return buf.String()
|
|
|
|
|
}
|
|
|
|
|
index := rand.Intn(entries)
|
|
|
|
|
var query string
|
|
|
|
|
for i := 0; i < entries; i++ {
|
|
|
|
|
val := generate()
|
|
|
|
|
if i == index {
|
|
|
|
|
query = val
|
|
|
|
|
}
|
|
|
|
|
tree.Add(val, i)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
tree.Search(query)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|