2016-01-08 20:14:31 +03:00
package glob
import (
"github.com/gobwas/glob/match"
2016-05-12 10:46:16 +03:00
"github.com/gobwas/glob/match/debug"
2016-01-08 20:14:31 +03:00
"reflect"
"testing"
)
2016-02-02 22:03:37 +03:00
var separators = [ ] rune { '.' }
2016-01-08 20:14:31 +03:00
func TestGlueMatchers ( t * testing . T ) {
for id , test := range [ ] struct {
in [ ] match . Matcher
exp match . Matcher
} {
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewSuper ( ) ,
match . NewSingle ( nil ) ,
2016-01-08 20:14:31 +03:00
} ,
2016-02-24 12:36:15 +03:00
match . NewMin ( 1 ) ,
2016-01-08 20:14:31 +03:00
} ,
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewAny ( separators ) ,
match . NewSingle ( separators ) ,
2016-01-08 20:14:31 +03:00
} ,
2016-01-12 14:06:59 +03:00
match . EveryOf { match . Matchers {
2016-02-24 12:36:15 +03:00
match . NewMin ( 1 ) ,
match . NewContains ( string ( separators ) , true ) ,
2016-01-08 20:14:31 +03:00
} } ,
} ,
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewSingle ( nil ) ,
match . NewSingle ( nil ) ,
match . NewSingle ( nil ) ,
2016-01-08 20:14:31 +03:00
} ,
2016-01-12 14:06:59 +03:00
match . EveryOf { match . Matchers {
2016-02-24 12:36:15 +03:00
match . NewMin ( 3 ) ,
match . NewMax ( 3 ) ,
2016-01-08 20:14:31 +03:00
} } ,
} ,
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewList ( [ ] rune { 'a' } , true ) ,
match . NewAny ( [ ] rune { 'a' } ) ,
2016-01-08 20:14:31 +03:00
} ,
2016-01-12 14:06:59 +03:00
match . EveryOf { match . Matchers {
2016-02-24 12:36:15 +03:00
match . NewMin ( 1 ) ,
match . NewContains ( "a" , true ) ,
2016-01-08 20:14:31 +03:00
} } ,
} ,
} {
2016-01-09 02:34:41 +03:00
act , err := compileMatchers ( test . in )
2016-01-08 20:14:31 +03:00
if err != nil {
t . Errorf ( "#%d convert matchers error: %s" , id , err )
continue
}
if ! reflect . DeepEqual ( act , test . exp ) {
2016-02-24 12:36:15 +03:00
t . Errorf ( "#%d unexpected convert matchers result:\nact: %#v;\nexp: %#v" , id , act , test . exp )
2016-01-08 20:14:31 +03:00
continue
}
}
}
2016-01-09 02:34:41 +03:00
func TestCompileMatchers ( t * testing . T ) {
2016-01-08 20:14:31 +03:00
for id , test := range [ ] struct {
in [ ] match . Matcher
exp match . Matcher
} {
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewSuper ( ) ,
match . NewSingle ( separators ) ,
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-01-08 20:14:31 +03:00
} ,
2016-01-14 18:29:13 +03:00
match . NewBTree (
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-01-14 18:29:13 +03:00
match . NewBTree (
2016-02-24 12:36:15 +03:00
match . NewSingle ( separators ) ,
match . NewSuper ( ) ,
2016-01-14 18:29:13 +03:00
nil ,
) ,
nil ,
) ,
2016-01-08 20:14:31 +03:00
} ,
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewAny ( nil ) ,
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-02-24 12:36:15 +03:00
match . NewAny ( nil ) ,
2016-01-08 20:14:31 +03:00
} ,
2016-01-14 18:29:13 +03:00
match . NewBTree (
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-02-24 12:36:15 +03:00
match . NewAny ( nil ) ,
match . NewAny ( nil ) ,
2016-01-14 18:29:13 +03:00
) ,
2016-01-08 20:14:31 +03:00
} ,
2016-01-09 02:34:41 +03:00
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewRange ( 'a' , 'c' , true ) ,
match . NewList ( [ ] rune { 'z' , 't' , 'e' } , false ) ,
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-02-24 12:36:15 +03:00
match . NewSingle ( nil ) ,
2016-01-09 02:34:41 +03:00
} ,
2016-02-24 12:36:15 +03:00
match . NewRow (
4 ,
match . Matchers {
match . NewRange ( 'a' , 'c' , true ) ,
match . NewList ( [ ] rune { 'z' , 't' , 'e' } , false ) ,
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-02-24 12:36:15 +03:00
match . NewSingle ( nil ) ,
} ... ,
) ,
2016-01-09 02:34:41 +03:00
} ,
2016-01-08 20:14:31 +03:00
} {
2016-01-09 02:34:41 +03:00
act , err := compileMatchers ( test . in )
2016-01-08 20:14:31 +03:00
if err != nil {
t . Errorf ( "#%d convert matchers error: %s" , id , err )
continue
}
if ! reflect . DeepEqual ( act , test . exp ) {
2016-02-24 12:36:15 +03:00
t . Errorf ( "#%d unexpected convert matchers result:\nact: %#v\nexp: %#v" , id , act , test . exp )
2016-01-08 20:14:31 +03:00
continue
}
}
}
2016-01-11 10:17:19 +03:00
func TestConvertMatchers ( t * testing . T ) {
2016-01-09 02:34:41 +03:00
for id , test := range [ ] struct {
in , exp [ ] match . Matcher
} {
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewRange ( 'a' , 'c' , true ) ,
match . NewList ( [ ] rune { 'z' , 't' , 'e' } , false ) ,
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-02-24 12:36:15 +03:00
match . NewSingle ( nil ) ,
match . NewAny ( nil ) ,
2016-01-09 02:34:41 +03:00
} ,
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewRow (
4 ,
[ ] match . Matcher {
match . NewRange ( 'a' , 'c' , true ) ,
match . NewList ( [ ] rune { 'z' , 't' , 'e' } , false ) ,
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-02-24 12:36:15 +03:00
match . NewSingle ( nil ) ,
} ... ,
) ,
match . NewAny ( nil ) ,
2016-01-09 02:34:41 +03:00
} ,
} ,
{
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewRange ( 'a' , 'c' , true ) ,
match . NewList ( [ ] rune { 'z' , 't' , 'e' } , false ) ,
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-02-24 12:36:15 +03:00
match . NewSingle ( nil ) ,
match . NewAny ( nil ) ,
match . NewSingle ( nil ) ,
match . NewSingle ( nil ) ,
match . NewAny ( nil ) ,
2016-01-09 02:34:41 +03:00
} ,
[ ] match . Matcher {
2016-02-24 12:36:15 +03:00
match . NewRow (
3 ,
match . Matchers {
match . NewRange ( 'a' , 'c' , true ) ,
match . NewList ( [ ] rune { 'z' , 't' , 'e' } , false ) ,
2016-01-14 21:32:02 +03:00
match . NewText ( "c" ) ,
2016-02-24 12:36:15 +03:00
} ... ,
) ,
match . NewMin ( 3 ) ,
2016-01-09 02:34:41 +03:00
} ,
} ,
} {
2016-01-14 18:29:13 +03:00
act := minimizeMatchers ( test . in )
2016-01-09 02:34:41 +03:00
if ! reflect . DeepEqual ( act , test . exp ) {
2016-02-24 12:36:15 +03:00
t . Errorf ( "#%d unexpected convert matchers 2 result:\nact: %#v\nexp: %#v" , id , act , test . exp )
2016-01-09 02:34:41 +03:00
continue
}
}
}
2016-01-08 20:14:31 +03:00
func pattern ( nodes ... node ) * nodePattern {
return & nodePattern {
nodeImpl : nodeImpl {
desc : nodes ,
} ,
}
}
func anyOf ( nodes ... node ) * nodeAnyOf {
return & nodeAnyOf {
nodeImpl : nodeImpl {
desc : nodes ,
} ,
}
}
func TestCompiler ( t * testing . T ) {
for id , test := range [ ] struct {
ast * nodePattern
result Glob
2016-02-02 22:03:37 +03:00
sep [ ] rune
2016-01-08 20:14:31 +03:00
} {
2016-05-14 22:08:32 +03:00
{
ast : pattern ( & nodeText { text : "abc" } ) ,
result : match . NewText ( "abc" ) ,
} ,
{
ast : pattern ( & nodeAny { } ) ,
sep : separators ,
result : match . NewAny ( separators ) ,
} ,
{
ast : pattern ( & nodeAny { } ) ,
result : match . NewSuper ( ) ,
} ,
{
ast : pattern ( & nodeSuper { } ) ,
result : match . NewSuper ( ) ,
} ,
{
ast : pattern ( & nodeSingle { } ) ,
sep : separators ,
result : match . NewSingle ( separators ) ,
} ,
{
ast : pattern ( & nodeRange {
lo : 'a' ,
hi : 'z' ,
not : true ,
} ) ,
result : match . NewRange ( 'a' , 'z' , true ) ,
} ,
{
ast : pattern ( & nodeList {
chars : "abc" ,
not : true ,
} ) ,
result : match . NewList ( [ ] rune { 'a' , 'b' , 'c' } , true ) ,
} ,
{
ast : pattern ( & nodeAny { } , & nodeSingle { } , & nodeSingle { } , & nodeSingle { } ) ,
sep : separators ,
result : match . EveryOf { Matchers : match . Matchers {
match . NewMin ( 3 ) ,
match . NewContains ( string ( separators ) , true ) ,
} } ,
} ,
{
ast : pattern ( & nodeAny { } , & nodeSingle { } , & nodeSingle { } , & nodeSingle { } ) ,
result : match . NewMin ( 3 ) ,
} ,
{
ast : pattern ( & nodeAny { } , & nodeText { text : "abc" } , & nodeSingle { } ) ,
sep : separators ,
result : match . NewBTree (
match . NewRow (
4 ,
match . Matchers {
match . NewText ( "abc" ) ,
match . NewSingle ( separators ) ,
} ... ,
) ,
match . NewAny ( separators ) ,
nil ,
) ,
} ,
2016-01-08 20:14:31 +03:00
{
2016-05-12 10:46:16 +03:00
ast : pattern ( & nodeText { text : "/" } , anyOf ( & nodeText { text : "z" } , & nodeText { text : "ab" } ) , & nodeSuper { } ) ,
2016-01-14 18:29:13 +03:00
sep : separators ,
result : match . NewBTree (
2016-05-12 10:46:16 +03:00
match . NewText ( "/" ) ,
2016-01-15 19:50:12 +03:00
nil ,
2016-05-12 10:46:16 +03:00
match . NewBTree (
match . NewAnyOf ( match . NewText ( "z" ) , match . NewText ( "ab" ) ) ,
nil ,
match . NewSuper ( ) ,
2016-01-15 19:50:12 +03:00
) ,
2016-02-24 12:36:15 +03:00
) ,
2016-01-15 19:50:12 +03:00
} ,
2016-05-14 22:08:32 +03:00
{
ast : pattern ( & nodeSuper { } , & nodeSingle { } , & nodeText { text : "abc" } , & nodeSingle { } ) ,
sep : separators ,
result : match . NewBTree (
match . NewRow (
5 ,
match . Matchers {
match . NewSingle ( separators ) ,
match . NewText ( "abc" ) ,
match . NewSingle ( separators ) ,
} ... ,
) ,
match . NewSuper ( ) ,
nil ,
) ,
} ,
{
ast : pattern ( & nodeAny { } , & nodeText { text : "abc" } ) ,
result : match . NewSuffix ( "abc" ) ,
} ,
{
ast : pattern ( & nodeText { text : "abc" } , & nodeAny { } ) ,
result : match . NewPrefix ( "abc" ) ,
} ,
{
ast : pattern ( & nodeText { text : "abc" } , & nodeAny { } , & nodeText { text : "def" } ) ,
result : match . NewPrefixSuffix ( "abc" , "def" ) ,
} ,
{
ast : pattern ( & nodeAny { } , & nodeAny { } , & nodeAny { } , & nodeText { text : "abc" } , & nodeAny { } , & nodeAny { } ) ,
result : match . NewContains ( "abc" , false ) ,
} ,
{
ast : pattern ( & nodeAny { } , & nodeAny { } , & nodeAny { } , & nodeText { text : "abc" } , & nodeAny { } , & nodeAny { } ) ,
sep : separators ,
result : match . NewBTree (
match . NewText ( "abc" ) ,
match . NewAny ( separators ) ,
match . NewAny ( separators ) ,
) ,
} ,
{
ast : pattern ( & nodeSuper { } , & nodeSingle { } , & nodeText { text : "abc" } , & nodeSuper { } , & nodeSingle { } ) ,
result : match . NewBTree (
match . NewText ( "abc" ) ,
match . NewMin ( 1 ) ,
match . NewMin ( 1 ) ,
) ,
} ,
{
ast : pattern ( anyOf ( & nodeText { text : "abc" } ) ) ,
result : match . NewText ( "abc" ) ,
} ,
{
ast : pattern ( anyOf ( pattern ( anyOf ( pattern ( & nodeText { text : "abc" } ) ) ) ) ) ,
result : match . NewText ( "abc" ) ,
} ,
{
ast : pattern ( anyOf (
pattern (
& nodeText { text : "abc" } ,
& nodeSingle { } ,
) ,
pattern (
& nodeText { text : "abc" } ,
& nodeList { chars : "def" } ,
) ,
pattern (
& nodeText { text : "abc" } ,
) ,
pattern (
& nodeText { text : "abc" } ,
) ,
) ) ,
result : match . NewBTree (
match . NewText ( "abc" ) ,
nil ,
match . AnyOf { Matchers : match . Matchers {
match . NewSingle ( nil ) ,
match . NewList ( [ ] rune { 'd' , 'e' , 'f' } , false ) ,
match . NewNothing ( ) ,
} } ,
) ,
} ,
{
ast : pattern (
& nodeRange { lo : 'a' , hi : 'z' } ,
& nodeRange { lo : 'a' , hi : 'x' , not : true } ,
& nodeAny { } ,
) ,
result : match . NewBTree (
match . NewRow (
2 ,
match . Matchers {
match . NewRange ( 'a' , 'z' , false ) ,
match . NewRange ( 'a' , 'x' , true ) ,
} ... ,
) ,
nil ,
match . NewSuper ( ) ,
) ,
} ,
{
ast : pattern ( anyOf (
pattern (
& nodeText { text : "abc" } ,
& nodeList { chars : "abc" } ,
& nodeText { text : "ghi" } ,
) ,
pattern (
& nodeText { text : "abc" } ,
& nodeList { chars : "def" } ,
& nodeText { text : "ghi" } ,
) ,
) ) ,
result : match . NewRow (
7 ,
match . Matchers {
match . NewText ( "abc" ) ,
match . AnyOf { Matchers : match . Matchers {
match . NewList ( [ ] rune { 'a' , 'b' , 'c' } , false ) ,
match . NewList ( [ ] rune { 'd' , 'e' , 'f' } , false ) ,
} } ,
match . NewText ( "ghi" ) ,
} ... ,
) ,
} ,
2016-01-08 20:14:31 +03:00
} {
2016-02-24 12:36:15 +03:00
m , err := compile ( test . ast , test . sep )
2016-01-08 20:14:31 +03:00
if err != nil {
t . Errorf ( "compilation error: %s" , err )
continue
}
2016-02-24 12:36:15 +03:00
if ! reflect . DeepEqual ( m , test . result ) {
2016-05-12 10:46:16 +03:00
t . Errorf ( "#%d results are not equal:\nexp: %#v\nact: %#v\nexp:\n%s\nact:\n%s\n" , id , test . result , m , debug . Graphviz ( "" , test . result . ( match . Matcher ) ) , debug . Graphviz ( "" , m . ( match . Matcher ) ) )
2016-01-08 20:14:31 +03:00
continue
}
}
}
2016-01-15 19:50:12 +03:00
const complexityString = "abcd"
//func BenchmarkComplexityAny(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewAny(nil)
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityContains(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewContains()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityList(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewList()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityMax(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewMax()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityMin(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewMin()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityNothing(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewNothing()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityPrefix(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewPrefix()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityPrefixSuffix(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewPrefixSuffix()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityRange(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewRange()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityRow(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewRow()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexitySingle(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewSingle(nil)
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexitySuffix(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewSuffix()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexitySuper(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewSuper()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityText(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewText()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityAnyOf(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewAnyOf()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityBTree(b *testing.B) {
// m := match.NewBTree(match.NewText("abc"), match.NewText("d"), match.NewText("e"))
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}
//func BenchmarkComplexityEveryOf(b *testing.B) {
2016-02-24 12:36:15 +03:00
// m := match.NewEveryOf()
2016-01-15 19:50:12 +03:00
// for i := 0; i < b.N; i++ {
// _ = m.Match(complexityString)
// _, _ = m.Index(complexityString)
// }
//}