2018-02-16 17:36:02 +03:00
|
|
|
package match
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestTree(t *testing.T) {
|
|
|
|
for _, test := range []struct {
|
|
|
|
tree Matcher
|
|
|
|
str string
|
|
|
|
exp bool
|
|
|
|
}{
|
2019-02-10 21:25:05 +03:00
|
|
|
{
|
|
|
|
NewTree(NewText("x"), NewText("y"), NewText("z")),
|
|
|
|
"0000x1111",
|
|
|
|
false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
NewTree(NewText("a"), NewSingle(nil), NewSingle(nil)),
|
|
|
|
"aaa",
|
|
|
|
false,
|
|
|
|
},
|
2018-02-16 17:36:02 +03:00
|
|
|
{
|
|
|
|
NewTree(NewText("abc"), NewSuper(), NewSuper()),
|
|
|
|
"abc",
|
|
|
|
true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
NewTree(NewText("a"), NewSingle(nil), NewSingle(nil)),
|
|
|
|
"aaa",
|
|
|
|
true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
NewTree(NewText("b"), NewSingle(nil), nil),
|
|
|
|
"bbb",
|
|
|
|
false,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
NewTree(
|
|
|
|
NewText("c"),
|
|
|
|
NewTree(
|
|
|
|
NewSingle(nil),
|
|
|
|
NewSuper(),
|
|
|
|
nil,
|
|
|
|
),
|
|
|
|
nil,
|
|
|
|
),
|
|
|
|
"abc",
|
|
|
|
true,
|
|
|
|
},
|
|
|
|
} {
|
|
|
|
t.Run("", func(t *testing.T) {
|
|
|
|
act := test.tree.Match(test.str)
|
|
|
|
if act != test.exp {
|
|
|
|
fmt.Println(Graphviz("NIL", test.tree))
|
|
|
|
t.Errorf("match %q error: act: %t; exp: %t", test.str, act, test.exp)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type fakeMatcher struct {
|
|
|
|
len int
|
|
|
|
segn int
|
|
|
|
name string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *fakeMatcher) Match(string) bool {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *fakeMatcher) Index(s string) (int, []int) {
|
|
|
|
seg := make([]int, 0, f.segn)
|
|
|
|
for x := 0; x < f.segn; x++ {
|
|
|
|
seg = append(seg, f.segn)
|
|
|
|
}
|
|
|
|
return 0, seg
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *fakeMatcher) MinLen() int {
|
|
|
|
return f.len
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *fakeMatcher) String() string {
|
|
|
|
return f.name
|
|
|
|
}
|
|
|
|
|
|
|
|
func BenchmarkMatchTree(b *testing.B) {
|
|
|
|
l := &fakeMatcher{4, 3, "left_fake"}
|
|
|
|
r := &fakeMatcher{4, 3, "right_fake"}
|
|
|
|
v := &fakeMatcher{2, 3, "value_fake"}
|
|
|
|
|
|
|
|
// must be <= len(l + r + v)
|
|
|
|
fixture := "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij"
|
|
|
|
|
|
|
|
bt := NewTree(v, l, r)
|
|
|
|
|
|
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
|
|
for pb.Next() {
|
|
|
|
bt.Match(fixture)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|